Как создать составные индексы 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
.)