Индекс PostgreSQL GIN на массиве uuid
Я хотел бы использовать индекс джина на uuid[]
(чтобы иметь эффективные тесты членства для массивов UUID). Однако, когда я пытаюсь это PostgreSQL дает мне ошибку:
mydb=> CREATE TABLE foo (val uuid[]);
CREATE TABLE
mydb=> CREATE INDEX foo_idx ON foo USING GIN(val);
ERROR: data type uuid[] has no default operator class for access method "gin"
HINT: You must specify an operator class for the index or define a default operator class for the data type.
как я могу добавить необходимый класс оператора, чтобы он работал?
отметим, что этой похожий вопрос для типа citext
но предоставленный ответ не работает.
2 ответов
Это можно сделать с помощью следующего оператора:
CREATE OPERATOR CLASS _uuid_ops DEFAULT
FOR TYPE _uuid USING gin AS
OPERATOR 1 &&(anyarray, anyarray),
OPERATOR 2 @>(anyarray, anyarray),
OPERATOR 3 <@(anyarray, anyarray),
OPERATOR 4 =(anyarray, anyarray),
FUNCTION 1 uuid_cmp(uuid, uuid),
FUNCTION 2 ginarrayextract(anyarray, internal, internal),
FUNCTION 3 ginqueryarrayextract(anyarray, internal, smallint, internal, internal, internal, internal),
FUNCTION 4 ginarrayconsistent(internal, smallint, anyarray, integer, internal, internal, internal, internal),
STORAGE uuid;
кредиты этой за то, что указал мне в правильном направлении.
соответствующие документы в сопряжение расширений с индексами, в частности, там описаны стратегия оператора и номера функций для Джина.
начиная с PostgreSQL 10 пользовательский класс оператора _uuid_ops
больше не нужно, так как теперь есть общий встроенный opclass array_ops
on anyarry
(см.: https://www.postgresql.org/docs/current/static/gin-builtin-opclasses.html)