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?
postgresql
index
Rory
quelle
quelle
CONCURRENTLY
, demCREATE INDEX
Befehl etwas hinzuzufügen , damit Sie die Tabelle nicht exklusiv sperren.Antworten:
Es gibt tatsächlich nur die
pg_indexes
Systemkatalogansicht wie folgt abzufragen :und Sie sollten die SQL-Anweisung zurückerhalten, mit der sie definiert wurde.
quelle
AND schemaname = 'myschema'
.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:
quelle
-s
, um Daten und, falls bekannt, den Tabellennamen mit auszuschließen-t
.Einfacher, wenn Sie sie alle wollen (alle Indizes) ...
quelle
indexdef
ist 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.
quelle