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?

Rory
la source
2
stackoverflow.com/questions/25958693
a_horse_with_no_name
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.

TomH
la source
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>
Egor Rogov
la source
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;
Michelle Sullivan
la source
-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.

Tom Lei
la source
Cela ne répond pas du tout à la question.
Laurenz Albe