Задать вопрос
valerium
@valerium
Изобретая велосипед

Как убедить PostgreSQL использовать индекс?

Есть таблица вида
label | timestamp
 AAA  | 1408937820000
 AAA  | 1408937880000
 AAA  | 1408937940000
 AAA  | 1408938000000
 BBB  | 1408938120000
 BBB  | 1408938180000
 BBB  | 1408938240000
 BBB  | 1408938300000
 BBB  | 1408938360000


То есть, некие метки и таймстампы для них. На всё это есть комбинированный индекс (label, timestamp). Есть ещё набор столбцов с числами, но они идут как балласт и в выборке не участвуют.

В этой таблице время от времени нужно искать последние доступные таймстампы для всех меток.

SELECT
  label, max(timestamp) as latest
FROM
  table
GROUP BY label;

Проблема в том, этот запрос ↑ не использует индекс и выполняется почти 2,5 часа (≈ 70 мегастрок). При этом запрос на конкретную метку использует индекс и выполняется за секунды.

SELECT
  label, max(timestamp) as latest
FROM
  table
WHERE label = 'AAA';

Доходит до смешного — если взять список уникальных меток (он есть готовый в отдельной таблице) и сделать 100500 отдельных запросов, получается на порядок быстрее, всё укладывается в ≈ 10 минут.

Из того, что уже успел нагуглить, получается, что заставить PostgreSQL использовать индекс нельзя, и это не баг, а фича. Вопрос в том, а есть ли какие-то магические техники, которые позволяли бы получить нужные мне данные быстро и за один запрос? Или хотя бы за два-три. Как я уже говорил, у меня есть таблица, в которой уже есть список уникальных меток. Это может помочь?
  • Вопрос задан
  • 308 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
у меня есть таблица, в которой уже есть список уникальных меток

try this:
select label, latest_stamp from labelstable lateral (
    select timestamp as latest_stamp from tablename where tablename.label = labeltable.label
    order by timestamp desc limit 1
) l

Postgresql 9.3 или выше.
Loose index scan по самой таблице тоже можно сделать, он просто будет более многословным.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы