Как добавить индекс PostgreSQL GIN для uuid в Postgres 9.6 - PullRequest
2 голосов
/ 05 апреля 2019

Я пытаюсь добавить индекс GIN, который включает UUID в базу данных Postgres 9.6.Технически это составной индекс, с поддержкой составного GIN из плагина btree_gin.

Я пытаюсь создать индекс с помощью этого оператора:

CREATE EXTENSION btree_gin;
CREATE INDEX ix_tsv ON text_information USING GIN (client_id, text_search_vector);

, но получаю эту ошибку:

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.

client_id isтип данных uuid и text_search_vector является tsvector.Я не думаю, что составной фактор / btree_gin действительно важен, так как я получаю ту же ошибку, пытаясь создать индекс только на client_id, но, надеюсь, если есть решение, то оно будет работать стакже составной индекс.

Я нашел Индекс GIN PostgreSQL для массива uuid , что, по-видимому, предполагает, что это возможно (если можно создать массив UUID, то, конечно, отдельный UUIDосуществимо).Тем не менее, решение было довольно непрозрачным для меня - не сразу понятно, как изменить это решение для поддержки одного UUID.

Я бы предпочел решение, которое не включает приведение UUID к другому типу в индексе или в другом столбце, так как я бы не стал писать специализированные запросы с приведением в них (мы используем django ORMгенерировать запросы атм.)

1 Ответ

0 голосов
/ 10 апреля 2019

Это возможно возможно для индексов GIN .Но не раньше, чем Postgres 11, где он был добавлен. Примечания к выпуску:

Разрешить btree_gin индексировать bool, bpchar, name и uuid типы данных (Матеус Оливейра)

Итак, простое решение - перейти на Postgres 11. Это должно быть хорошей новостью для вас:

9 апреля 2019: Cloud SQL теперь поддерживает версию PostgreSQL11.1 Beta

или , во многих случаях вы можете альтернативно использовать GiST index , для которого то же самое было введено в Postgres 10 уже. Примечания к выпуску:

Добавить поддержку индексации в btree_gist для типа данных UUID (Пол Джунгвирт)

Связанный:

Если ни один из вариантов не подходит, вы вернулись к тому, чего хотели избежать:

приведение uuid к другому типу в индексе

Вы можете создать индекс выражения для (непротиворечивого!) text представления или, теоретически, для двух bigint производных столбцовот uuid.Но первое делает индекс значительно больше и медленнее, а второе - намного сложнее ...

Синтаксис приведения достаточно прост: uuid::text.В выражении индекса, для которого требуется дополнительный набор скобок.При установленном дополнительном модуле btree_gin:

CREATE INDEX ix_uuid_tsv ON text_information USING GIN (<b>(client_id::uuid)</b>, tsv);

Связано:

Или вы можете сделать бэкпорт этой функции из Postgres 11, которая не предусмотрена в размещенной службе, такой как Google Cloud SQL для PostgreSQL, как вы упомянули в комментарии.И я вряд ли вижу случай использования, когда кто-то будет достаточно опытен для реализации бэкпорта, но не для обновления до Postgres 11.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...