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?
postgresql
index
Rory
la source
la source
CONCURRENTLY
à laCREATE INDEX
commande, afin de ne pas prendre un verrou exclusif sur la table.Réponses:
En fait, il suffit d'interroger la
pg_indexes
vue du catalogue système comme suit:et vous devriez récupérer l'instruction SQL utilisée pour la définir.
la source
AND schemaname = 'myschema'
.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:
la source
-s
pour exclure les données et, s'il est connu, le nom de la table avec-t
.Plus simplement si vous les voulez tous (tous les index) ...
la source
indexdef
n'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.
la source