ВЫБЕРИТЕ COUNT (*) ГДЕ DATE_PART (...) медленнее в PostgreSQL / TimescaleDB - PullRequest
1 голос
/ 03 февраля 2020

Чтобы найти количество строк в таблице temperatures, которые существуют за каждый час, я выполняю серию SQL запросов в моей базе данных PostgreSQL 11.2 с расширением TimescaleDB 1.6.0. temperatures является гипертаблицей TimescaleDB.

Например,

SELECT COUNT(*) FROM temperatures
    WHERE DATE_PART('year', "timestamp") = 2020
    AND DATE_PART('month', "timestamp") = 2
    AND DATE_PART('day', "timestamp") = 2
    AND DATE_PART('hour', "timestamp") = 0
    AND DATE_PART('minute', "timestamp") = 0

Вопрос: Однако этот запрос выглядит очень медленным (я думаю), принимая около 6-8 секунд на запрос без других запросов к этой базе данных. Таблица temperatures содержит 11,5 миллионов строк. На каждый час приходится около 100-2000 строк.

Поиск предложений по улучшению скорости таких запросов. Спасибо!

1 Ответ

3 голосов
/ 03 февраля 2020

Не применять функции даты к столбцу меток времени: это требует повторных вычислений для каждой строки (всего 5) и не позволяет базе данных использовать существующий индекс для столбца меток времени:

Это должно быть быстрее:

select count(*)
from temperatures
where 
    timestamp >= '2020-02-02 00:00:00'::timestamp 
    and timestamp < '2020-02-01 00:01:00'::timestamp

В этом запросе используется стратегия полуоткрытого интервала для проверки столбца отметки времени по двум постоянным значениям.

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