Увеличивает ли кластерный индекс по времени скорость запроса, когда мы хотим получить максимальную временную группу по определенному идентификатору? - PullRequest
0 голосов
/ 20 января 2019

Рассмотрим следующий запрос

SELECT my_id, my_info FROM my_table as r
JOIN (
    SELECT my_id, max(my_time) as max_time FROM my_table
    WHERE my_time > timestamp '2019-01-10 00:00:00'
    GROUP BY my_id) as k
ON k.my_id = r.my_id and k.max_time = r.my_time

И следующую таблицу

my_table
    my_id [text, secondary index]
    my_info [arbitrary]
    my_time [timestamp with timezone, clustered index]

Я думаю, что наиболее эффективный запрос, если плотность элементов my_id невелика, будет следующей

  1. Получить набор всех уникальных my_id из таблицы индексов
  2. Сканирование всей таблицы из первой строки (гарантируется самая высокая временная метка из-за кластеризации) и выборка my_info изmy_id если не был получен ранее.

Я не уверен, что именно это делает postgres, но мне интересно знать, поможет ли использование кластерного индекса в моем исходном запросе

Еслиответ «нет», есть ли способ увеличить скорость выполнения запроса выше, учитывая структуру таблицы?

1 Ответ

0 голосов
/ 20 января 2019

Я полагаю, что кластеризованный индекс должен помочь предикату фильтрации WHERE my_time > timestamp '2019-01-10 00:00:00', но вы должны рассмотреть планы объяснения, чтобы определить, как запрос был обработан. Вы также можете рассмотреть возможность использования подхода оконной функции:

SELECT k.my_id, k.my_info
JOIN (
    SELECT my_id, my_info
       , ROW_NUMBER() OVER(PARTITION BY my_id ORDER BY my_time DESC) as rn
    FROM my_table
    WHERE my_time > timestamp '2019-01-10 00:00:00'
    ) as k
WHERE k.rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...