Как создать индекс с условными обозначениями и использовать его - PullRequest
0 голосов
/ 04 октября 2018

У меня есть таблица только с тремя столбцами: id, time, value

У меня уже есть индекс на (id, time).

Теперь мне нужно ускоритьсядля недавнего запроса данных, поэтому я думаю, что мне нужно создавать новый индекс для каждого дня.

create index heat_20181001_20181003 on mytable using
brin ("id", "time") where time between '2018-10-01 00:00:00' and 
'2018-10-03 23:59:59';

Но когда я запрашиваю, он показывает использование старого индекса, а новый не используется.

Запрос:

EXPLAIN  ANALYZE ( select * from mytable where time between 
'2018-10-01 00:00:00' and '2018-10-03 23:59:59' and "id" = '453615414');

Результат:

Index Scan using "mytable_id_579df36b7ac8aa8e_idx" on mytable 
  (cost=0.57..3931.98 rows=1133 width=87) (actual time=3.045..12294.511 rows=3762 loops=1)
  Index Cond: ((("id")::text = '453615414'::text) AND ("time" >= '2018-10-01 00:00:00+08'::timestamp with time zone) AND ("time" <= '2018-10-03 23:59:59+08'::timestamp with time zone))
Planning time: 0.320 ms
Execution time: 12295.688 ms
(4 rows)

Как использовать индекс для запроса?Или как я могу улучшить это?

1 Ответ

0 голосов
/ 04 октября 2018

Если временной интервал является переменным, ваш исходный индекс идеально подходит (поэтому PostgreSQL использует его).

Если временной интервал постоянен, идеальный индекс будет

CREATE INDEX ON mytable (id)
   WHERE time BETWEEN '2018-10-01 00:00:00' AND '2018-10-03 23:59:59';

Индекс BRIN, вероятно, бесполезен, потому что физический порядок кортежей в таблице не идентичен порядку индекса.

Вы, безусловно, должны не создавать индекс в день, ваш исходный индексдостаточно хорош.

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