Necesito recrear un índice en PostgreSQL que ha sufrido una hinchazón del índice. Como necesito que el índice sea utilizable mientras se está creando, no puedo usar REINDEX. Voy a recrear el índice con un nuevo nombre y luego descartar el antiguo. ¿Hay alguna forma de ver la instrucción SQL que se usó para crear un índice, así que puedo copiar eso?
postgresql
index
Rory
fuente
fuente
CONCURRENTLY
alCREATE INDEX
comando, para no tener un bloqueo exclusivo en la tabla.Respuestas:
En realidad, solo consulte la
pg_indexes
vista del catálogo del sistema de la siguiente manera:y debería recuperar la instrucción SQL utilizada para definirla.
fuente
AND schemaname = 'myschema'
.Sí, la declaración SQL completa para recrear el índice está en el catálogo del sistema. La forma más simple en que puedo pensar es usando pg_dump / pg_restore:
fuente
-s
para excluir datos y, si se conoce, el nombre de la tabla con-t
.Más simplemente si los quieres todos (todos los índices) ...
fuente
indexdef
todavía no es exactamente lo mismo que la declaración de creación en el caso de un índice parcial. Por ejemplo, si creamos un índice con la siguiente declaración:CREATE INDEX item_orgunit_idx ON items (orgunit_id) WHERE type IN ('invoice', 'purchaseorder', 'beanpayment');
postgres generará el siguiente indexdef:
CREATE INDEX item_orgunit_idx ON public.items USING btree (orgunit_id) WHERE ((type)::text = ANY ((ARRAY['invoice'::character varying, 'purchaseorder'::character varying, 'beanpayment'::character varying])::text[]))
Aunque postgres indexdef tiene todos los tipos inferidos y probablemente sea mejor, nuestro ORM está comparando la cláusula where de los dos índices y cree que es diferente cuando generamos scripts de migración. Lo cual es un problema para nosotros.
fuente