Czy istnieje sposób pokazania instrukcji tworzenia indeksu w PostgreSQL

14

Muszę odtworzyć indeks w PostgreSQL, który cierpi na wzdęcie indeksu. Ponieważ potrzebuję indeksu, aby był użyteczny podczas tworzenia, nie mogę używać REINDEX. Mam zamiar odtworzyć indeks pod nową nazwą, a następnie upuścić stary. Czy jest jakiś sposób, aby zobaczyć instrukcję SQL, która została użyta do utworzenia indeksu, więc mogę go po prostu skopiować?

Rory
źródło
1
Pamiętaj, aby dodać CONCURRENTLYdo CREATE INDEXpolecenia, aby nie zabrać wyłącznej blokady na stole.
Craig Ringer

Odpowiedzi:

26

Tak naprawdę, po prostu przeszukaj pg_indexeswidok katalogu systemowego w następujący sposób:

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

i powinieneś odzyskać instrukcję SQL użytą do jej zdefiniowania.

TomH
źródło
4
Pamiętaj, że nazwy indeksów są unikalne tylko dla schematu . Możesz dodać AND schemaname = 'myschema'.
Erwin Brandstetter,
0

Tak, pełna instrukcja SQL do odtworzenia indeksu znajduje się w katalogu systemowym. Najprostszym sposobem, jaki mogę wymyślić, jest użycie pg_dump / pg_restore:

$ pg_dump -F c | pg_restore -I <your_index_name>
Egor Rogov
źródło
4
Jeśli baza danych jest duża, może to być przesada :) Możesz dodać, -saby wykluczyć dane i, o ile jest znana, nazwę tabeli za pomocą -t.
dezso
-1

Mówiąc prościej, jeśli chcesz je wszystkie (wszystkie indeksy) ...

=# SELECT indexdef FROM pg_indexes;
Michelle Sullivan
źródło
-1

indexdefnadal nie jest dokładnie taki sam jak instrukcja tworzenia w przypadku indeksu częściowego. Na przykład, jeśli utworzymy indeks z następującą instrukcją: CREATE INDEX item_orgunit_idx ON items (orgunit_id) WHERE type IN ('invoice', 'purchaseorder', 'beanpayment');

postgres wygeneruje następujący 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[]))

Chociaż postgres indexdef ma wszystkie wywnioskowane typy i jest prawdopodobnie lepszy, nasz ORM porównuje dwie klauzule indeksu dwóch i uważa, że ​​jest inaczej, gdy generujemy skrypty migracji. To jest dla nas problem.

Tom Lei
źródło
To wcale nie odpowiada na pytanie.
Laurenz Albe