Gibt es eine Möglichkeit, die Erstellungsanweisung für einen Index in PostgreSQL anzuzeigen?

13

Ich muss einen Index in PostgreSQL neu erstellen, bei dem der Index aufgebläht ist. Da der Index während der Erstellung verwendet werden muss, kann ich REINDEX nicht verwenden. Ich werde den Index mit einem neuen Namen neu erstellen und dann den alten löschen. Gibt es eine Möglichkeit, die SQL-Anweisung anzuzeigen, mit der ein Index erstellt wurde, damit ich sie einfach kopieren kann?

Rory
quelle
2
stackoverflow.com/questions/25958693
a_horse_with_no_name
1
Denken Sie daran CONCURRENTLY, dem CREATE INDEXBefehl etwas hinzuzufügen , damit Sie die Tabelle nicht exklusiv sperren.
Craig Ringer

Antworten:

24

Es gibt tatsächlich nur die pg_indexesSystemkatalogansicht wie folgt abzufragen :

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

und Sie sollten die SQL-Anweisung zurückerhalten, mit der sie definiert wurde.

TomH
quelle
4
Beachten Sie, dass Indexnamen nur pro Schema eindeutig sind . Vielleicht möchten Sie hinzufügen AND schemaname = 'myschema'.
Erwin Brandstetter
0

Ja, die vollständige SQL-Anweisung zum Neuerstellen des Index befindet sich im Systemkatalog. Der einfachste Weg, den ich mir vorstellen kann, ist die Verwendung von pg_dump / pg_restore:

$ pg_dump -F c | pg_restore -I <your_index_name>
Egor Rogov
quelle
4
Wenn die Datenbank groß ist, kann dies ein Overkill sein :) Möglicherweise möchten Sie hinzufügen -s, um Daten und, falls bekannt, den Tabellennamen mit auszuschließen -t.
Dekso
-1

Einfacher, wenn Sie sie alle wollen (alle Indizes) ...

=# SELECT indexdef FROM pg_indexes;
Michelle Sullivan
quelle
-1

indexdefist immer noch nicht genau das gleiche wie die Erstellungsanweisung im Fall eines Teilindex. Zum Beispiel, wenn wir einen Index mit der folgenden Anweisung erstellen: CREATE INDEX item_orgunit_idx ON items (orgunit_id) WHERE type IN ('invoice', 'purchaseorder', 'beanpayment');

postgres generiert den folgenden 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[]))

Obwohl postgres indexdef alle abgeleiteten Typen hat und wahrscheinlich besser ist, vergleicht unser ORM die where-Klausel der beiden Indizes und denkt, dass sie sich beim Generieren von Migrationsskripten unterscheidet. Welches ist ein Problem für uns.

Tom Lei
quelle
Dies beantwortet die Frage überhaupt nicht.
Laurenz Albe