Как создать составные индексы pg_trgm со столбцами даты

SELECT col1, max(date) as max_date
FROM table
WHERE col1 ILIKE 'name'
GROUP BY col1

Здесь col1 varchar и дата timestamp with time zone тип данных. Так создано расширение CREATE EXTENSION pg_trgm

Затем попробовал следующие индексы и получил ошибки:

1: Проблема: ОШИБКА: класс операторов "gin_trgm_ops" не принимает метку времени типа данных с часовым поясом

CREATE INDEX CONCURRENTLY trgm_table_col1_date_index
ON table 
USING gin (provider_id, date gin_trgm_ops);

2: Проблема: ОШИБКА: оператор класса "text_pattern_ops" не существует для метода доступа "джин"

 CREATE INDEX CONCURRENTLY trgm_table_col1_date_index
    ON table 
    USING gin (provider_id, date text_pattern_ops);

Как я могу создать индекс для вышеупомянутого запроса для более быстрого выполнения? Любая помощь будет по достоинству оценена!

РЕДАКТИРОВАТЬ: Таким образом, это работает синтаксически, но не ускоряет запрос:

CREATE INDEX CONCURRENTLY trgm_provider_date_index
ON table 
USING gin (provider_id gin_trgm_ops, date_var) 

1 ответ

Насколько я знаю, Postgres не умеет оптимизировать min() / max() запросы с использованием индекса GIN.

Вы можете добавить date столбцы индекса GIN (а также другие скалярные типы, такие как int, text и т. д.) путем установки btree_gin Модуль Contribu. Однако, поскольку методы индексации GIN не обязаны хранить свои записи в каком-либо определенном порядке, Postgres не может предположить, что они будут полезны для определения максимума, поэтому они будут игнорироваться.

(Я не могу найти конкретную ссылку на это в документации, но я считаю, что это идентично ограничению, которое не позволяет использовать что-либо, кроме B-дерева, для оптимизации ORDER BY.)

Другие вопросы по тегам