C'è un modo per mostrare l'istruzione di creazione per un indice in PostgreSQL


14

Devo ricreare un indice in PostgreSQL che ha subito un gonfiamento dell'indice. Dato che ho bisogno che l'indice sia utilizzabile mentre viene creato, non posso usare REINDEX. Ho intenzione di ricreare l'indice con un nuovo nome e quindi rilasciare quello vecchio. C'è un modo per vedere l'istruzione SQL che è stata utilizzata per creare un indice in modo che io possa semplicemente copiarlo?



1
Ricorda di aggiungere CONCURRENTLYal CREATE INDEXcomando, quindi non prendere un blocco esclusivo sul tavolo.
Craig Ringer,

Risposte:


26

In realtà, è sufficiente eseguire una query sulla pg_indexesvista del catalogo di sistema come segue:

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

e dovresti recuperare l'istruzione SQL utilizzata per definirla.


4
Si noti che i nomi degli indici sono unici per schema . Potresti voler aggiungere AND schemaname = 'myschema'.
Erwin Brandstetter,

0

Sì, l'istruzione SQL completa per ricreare l'indice si trova nel catalogo di sistema. Il modo più semplice a cui riesco a pensare è usare pg_dump / pg_restore:

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

4
Se il database è grande, questo può essere un errore eccessivo :) Potrebbe essere necessario aggiungere -sper escludere i dati e, se noto, il nome della tabella con -t.
dezso,

-1

Più semplicemente se li vuoi tutti (tutti gli indici) ...

=# SELECT indexdef FROM pg_indexes;

-1

indexdefnon è ancora esattamente lo stesso dell'istruzione di creazione nel caso di un indice parziale. Ad esempio se creiamo un indice con la seguente istruzione: CREATE INDEX item_orgunit_idx ON items (orgunit_id) WHERE type IN ('invoice', 'purchaseorder', 'beanpayment');

postgres genererà il seguente 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[]))

Sebbene postgres indexdef abbia tutti i tipi dedotti ed è probabilmente migliore, il nostro ORM sta confrontando la clausola where dei due indici e pensa che sia diverso quando generiamo script di migrazione. Questo è un problema per noi.


Questo non risponde affatto alla domanda.
Laurenz Albe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.