Как создать составные индексы 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" не существует для метода доступа "gin"

 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) 

person Atihska    schedule 23.01.2018    source источник


Ответы (1)


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

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

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

person Nick Barnes    schedule 24.01.2018
comment
Пожалуйста, проверьте мое редактирование. Создание такого индекса работает, но не ускоряет запрос. CREATE INDEX CONCURRENTLY trgm_general_provider_date_index ON general_catalog USING gin (provider_id gin_trgm_ops, acquisition_date) - person Atihska; 24.01.2018
comment
@Atihska: Как я уже сказал, я не ожидаю, что это поможет, если вы сравниваете его с индексом только по provider_id (во всяком случае, дополнительный столбец ухудшит ситуацию). - person Nick Barnes; 25.01.2018
comment
Итак, просто создайте индекс для provider_id? Как я могу сделать это быстрее? - person Atihska; 25.01.2018
comment
@Atihska: Как я могу сделать это быстрее, это слишком широко, чтобы обсуждать в комментариях. Вероятно, вам следует опубликовать новый вопрос. Не забудьте включить определения таблиц и индексов, образцы данных, проблемный запрос и ваши EXPLAIN ANALYSE выходные данные. - person Nick Barnes; 25.01.2018