Existe-t-il un moyen d'afficher l'instruction de création d'un index dans PostgreSQL


14

J'ai besoin de recréer un index dans PostgreSQL qui a subi un gonflement d'index. Puisque j'ai besoin que l'index soit utilisable pendant sa création, je ne peux pas utiliser REINDEX. Je vais recréer l'index avec un nouveau nom, puis supprimer l'ancien. Existe-t-il un moyen de voir l'instruction SQL qui a été utilisée pour créer un index afin que je puisse simplement le copier?



1
N'oubliez pas d'ajouter CONCURRENTLYà la CREATE INDEXcommande, afin de ne pas prendre un verrou exclusif sur la table.
Craig Ringer du

Réponses:


26

En fait, il suffit d'interroger la pg_indexesvue du catalogue système comme suit:

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

et vous devriez récupérer l'instruction SQL utilisée pour la définir.


4
Notez que les noms d'index ne sont uniques que par schéma . Vous voudrez peut-être ajouter AND schemaname = 'myschema'.
Erwin Brandstetter

0

Oui, l'instruction SQL complète pour recréer l'index se trouve dans le catalogue système. La façon la plus simple à laquelle j'imagine est d'utiliser pg_dump / pg_restore:

$ pg_dump -F c | pg_restore -I <your_index_name>

4
Si la base de données est volumineuse, cela peut être exagéré :) Vous souhaiterez peut-être ajouter -spour exclure les données et, s'il est connu, le nom de la table avec -t.
dezso

-1

Plus simplement si vous les voulez tous (tous les index) ...

=# SELECT indexdef FROM pg_indexes;

-1

indexdefn'est toujours pas exactement la même que l'instruction de création dans le cas d'un index partiel. Par exemple, si nous créons un index avec l'instruction suivante: CREATE INDEX item_orgunit_idx ON items (orgunit_id) WHERE type IN ('invoice', 'purchaseorder', 'beanpayment');

postgres générera l'index suivant: 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[]))

Bien que postgres indexdef ait tous les types inférés et soit probablement meilleur, notre ORM compare la clause where des deux index et pense que c'est différent lorsque nous générons des scripts de migration. C'est un problème pour nous.


Cela ne répond pas du tout à la question.
Laurenz Albe
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.