¿Hay alguna manera de mostrar la declaración de creación de un índice en PostgreSQL

14

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?

Rory
fuente
2
stackoverflow.com/questions/25958693
a_horse_with_no_name
1
Recuerde agregar CONCURRENTLYal CREATE INDEXcomando, para no tener un bloqueo exclusivo en la tabla.
Craig Ringer el

Respuestas:

26

En realidad, solo consulte la pg_indexesvista del catálogo del sistema de la siguiente manera:

SELECT indexdef FROM pg_indexes WHERE indexname = '...'

y debería recuperar la instrucción SQL utilizada para definirla.

TomH
fuente
44
Tenga en cuenta que los nombres de índice son únicos por esquema . Es posible que desee agregar AND schemaname = 'myschema'.
Erwin Brandstetter
0

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:

$ pg_dump -F c | pg_restore -I <your_index_name>
Egor Rogov
fuente
44
Si la base de datos es grande, esto puede ser una exageración :) Es posible que desee agregar -spara excluir datos y, si se conoce, el nombre de la tabla con -t.
dezso
-1

Más simplemente si los quieres todos (todos los índices) ...

=# SELECT indexdef FROM pg_indexes;
Michelle Sullivan
fuente
-1

indexdeftodaví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.

Tom Lei
fuente
Esto no responde a la pregunta en absoluto.
Laurenz Albe