¿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?



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.


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>

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;

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


Esto no responde a la pregunta en absoluto.
Laurenz Albe
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.