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ć?
postgresql
index
Rory
źródło
źródło
CONCURRENTLY
doCREATE INDEX
polecenia, aby nie zabrać wyłącznej blokady na stole.Odpowiedzi:
Tak naprawdę, po prostu przeszukaj
pg_indexes
widok katalogu systemowego w następujący sposób:i powinieneś odzyskać instrukcję SQL użytą do jej zdefiniowania.
źródło
AND schemaname = 'myschema'
.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:
źródło
-s
aby wykluczyć dane i, o ile jest znana, nazwę tabeli za pomocą-t
.Mówiąc prościej, jeśli chcesz je wszystkie (wszystkie indeksy) ...
źródło
indexdef
nadal 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.
źródło