Как использовать uuid с типом индекса postgresql gist?

Я не могу использовать непосредственно uuid с индексом gist

CREATE INDEX idx_leaderboads_values_gist
  ON leaderboard_entry
  USING gist
  (id_leaderboard , value);

и я получил эту ошибку:

ошибка: тип данных uuid не имеет класса оператора по умолчанию для метода доступа "gist"

подсказка: необходимо указать класс оператора для индекса или определить класс оператора по умолчанию для типа данных.

2 ответов


Postgres 10 или новее

btree_gist теперь также охватывает тип данных uuid, как Павел прокомментировал. (И некоторые другие типы данных, замечательно все enum типы.)

теперь все, что вам нужно сделать: установить расширение раз в базе:

CREATE EXTENSION btree_gist;

затем ваш индекс должен просто работать.

по теме:


Postgres 9.6 или старше

(оригинал ответа.)
Обычно я бы предложил дополнительный модуль btree_gist, но типа uuid is не охватываются.

теоретически, так как UUID является a 128-bit quantity (в документации), наиболее эффективным способом было бы преобразовать его в два bigint или float8 для целей индексирования. Но ни один из этих слепков не определен в стандартных Postgres.

нашел удар в этом направлении в списке pqsql-хакеров, но, кажется, неудачно.

оставшаяся опция является функциональным индексом GiST на text представление:

CREATE INDEX idx_leaderboads_values_gist
ON leaderboard_entry USING gist (id_leaderboard, cast("value" AS text));

использовать функциональный индекс, запросы должны соответствовать этому выражению. Вы можете используйте стенографию "value"::text в запросах (но не в определении индекса без добавления дополнительных скобок).

в сторону: не используйте value как имя столбца это зарезервированное слово в стандартном SQL.

вопрос: почему вам нужен индекс GiST. Лучшее решение зависит от цели.


Если вы используете Postgres 10 и перенесли свою базу данных из предыдущей версии с помощью дампа / восстановления, вам может потребоваться запустить:

ALTER EXTENSION btree_gist UPDATE;

чтобы получить индексы gist для работы с UUID.