type uuid
in Ihrer DDL-Anweisung ist eine Abkürzung für SET DATA TYPE uuid
. Das Handbuch:
varchar_pattern_ops
ist eine Operatorklasse
das würde in Ihrer Fehlermeldung erwähnt werden, wenn Sie uuid
haben Verwenden dieser Operatorklasse in einem beliebigen Index. In der Regel, um eine schnellere Sortierung, Mustererkennung und Bereichsbedingungen zu ermöglichen.
Um das Problem zu beheben, löschen Sie widersprüchliche Indizes, ändern Sie den Datentyp und erstellen Sie die Indizes dann ohne die spezielle Operatorklasse - if - neu Sie brauchen sie noch.
Allerdings einige typische Abfragen, die einen varchar_pattern_ops
verwenden würden index würde mit dem Datentyp uuid
nicht mehr funktionieren statt varchar
. Wie Mustervergleich:
Stellen Sie sicher, dass Sie auch solche Abfragen beheben.
@fl0cke wies darauf hin eine verwandte Antwort:
Ich schlage eine etwas andere Route vor. Es ist billiger, den Index zu löschen, den Datentyp zu ändern und dann Erstellen Sie einen neuen Index - wenn es noch nützlich ist.
DROP INDEX tbl_guid_varchar_pattern_ops_idx;
ALTER TABLE tbl ALTER COLUMN guid TYPE uuid USING guid::uuid;
CREATE INDEX tbl_guid_idx ON tbl (guid);
Wie finde ich einen anstößigen Index?
In modernen Versionen von Postgres erhalten Sie vorhandene Indizes für die Tabelle mit \d tbl
in psql.
Um alle vollständigen CREATE INDEX
zu erhalten Anweisungen für die angegebene Tabelle:
SELECT pg_get_indexdef(indexrelid) || ';' AS idx
FROM pg_index
WHERE indrelid = 'public.tbl'::regclass; -- optionally schema-qualified
Um nur die zu erhalten, verwenden Sie varchar_pattern_ops
:
SELECT pg_get_indexdef(i.indexrelid) || ';' AS idx
FROM pg_index i
JOIN pg_opclass o ON o.oid = ANY (i.indclass)
WHERE i.indrelid = 'public.big'::regclass
AND o.opcname = 'varchar_pattern_ops';
Einzelheiten:
- Indexe von einer Tabelle in eine andere kopieren
- Wie kann ich alle Indizes einer Tabelle in Postgres löschen?