Как использовать 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;
затем ваш индекс должен просто работать.
по теме:
- ограничение исключения для столбца bitstring с побитовым и оператор
- создание многоколоночного индекса в PostgreSQL, содержащего как скалярные, так и массивные столбцы
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.