В общем любой запрос с фильтром в таблицу history_uint оказывался слишком долгим. Поэтому решил сделать мат вьюху запросом, где сначала отсортировал по дате, потом ограничил лимитом до 200 лямов строк (столько примерно прибывает за пару дней). А потом уже по готовой мат вьюхе искал нужные значения.
Код:
CREATE*MATERIALIZED*VIEW*prn_rep*AS*
SELECT os3.clock as clock, os3.itemid as itemid
from
(select os2.clock, os2.itemid
from history_uint os2
order by os2.clock desc
limit 200000000) os3,
( SELECT items.itemid
FROM hosts hosts,
items items
WHERE hosts.hostid = items.hostid AND (items.key_::text = ANY (ARRAY['page_copy_2'::character varying, 'page_copy_1'::character varying, 'page_counter'::character varying]::text[]))) item
where
os3.itemid = item.itemid;
Код:
clock = (select max(os2.clock) from prn_rep os2 where os2.itemid = uint.itemid)
Добился желаемого, результат сократился с часа с лишним до 17-20 минут, что уже приемлемо.