Доброго времени суток. Структура бд:
CREATE TABLE testTable (
id serial,
date int,
testField1 smallint,
testField2 real,
val smallint,
PRIMARY KEY(id)
);
Мне нужно выбрать последнюю по дате запись в группировке по testField1 и testField2 и потом сложить значения val по группировке по testField1
Запрос:
SELECT SUM(val), testField1 FROM (
SELECT DISTINCT ON (testField1, testField2) testField1, testField2, val FROM testtable ORDER BY testField1, testField2, date DESC
) t1 GROUP BY testField1
Все хорошо отрабатывает и дает нужный мне результат, но если запрос нужен с условиями вида:
SELECT SUM(val), testField1 FROM (
SELECT DISTINCT ON (testField1, testField2) testField1, testField2, val FROM testtable ORDER BY testField1, testField2, date DESC
) t1 where testField1 in (1,5,50,10,19) and testField2 in (5,8,10,13) GROUP BY testField1
То запрос выполняется на порядок больше.
Index:
CREATE INDEX testIndex on testtable (testField1, testField2, date desc)
Так вот, как это можно оптимизировать и делать эти выборки быстрее. В базе около 10 миллионов документов. И постоянно растет. testField1 от 1 до 1500, testField2 от 1 до 1500. БД Postgresql 9.6.2. Заранее спасибо за ответ