type uuid
in uw DDL-statement is een afkorting voor SET DATA TYPE uuid
. De handleiding:
varchar_pattern_ops
is een operatorklasse
dat wordt vermeld in uw foutmelding als u uuid
. heeft gebruik van deze operatorklasse in elke index. Meestal om sneller sorteren, patroonovereenkomst en bereikcondities mogelijk te maken.
Om dit op te lossen, verwijdert u conflicterende indexen, wijzigt u het gegevenstype en maakt u vervolgens indexen opnieuw aan zonder de speciale operatorklasse - if je hebt ze nog steeds nodig.
Echter, enkele typische zoekopdrachten die gebruik zouden maken van een varchar_pattern_ops
index zou stoppen met werken met gegevenstype uuid
in plaats van varchar
. Zoals patroon-matching:
Zorg ervoor dat u dergelijke vragen ook oplost.
@fl0cke gewezen een gerelateerd antwoord:
Ik stel een iets andere route voor. Het is goedkoper om de index te laten vallen, het gegevenstype te wijzigen en dan maak een nieuwe index - als deze nog steeds nuttig is.
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);
Hoe vind ik de gewraakte index?
In moderne versies van Postgres krijg je bestaande indexen voor de tabel met \d tbl
in psql.
Om alles compleet te krijgen CREATE INDEX
uitspraken voor de gegeven tabel:
SELECT pg_get_indexdef(indexrelid) || ';' AS idx
FROM pg_index
WHERE indrelid = 'public.tbl'::regclass; -- optionally schema-qualified
Om alleen degenen te krijgen die varchar_pattern_ops
gebruiken :
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';
Details:
- Kopieer indexen van de ene tabel naar de andere
- Hoe kan ik alle indexen van een tabel in Postgres verwijderen?