Есть таблица вида
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 использовать индекс нельзя, и это не баг, а фича. Вопрос в том, а есть ли какие-то магические техники, которые позволяли бы получить нужные мне данные быстро и за один запрос? Или хотя бы за два-три. Как я уже говорил, у меня есть таблица, в которой уже есть список уникальных меток. Это может помочь?