postgresql: выбрать последние значения по метке времени для каждого итема zabbix.
Доброго времени суток!
Создал запрос в базу заббикса, который выводит мне отчет по принтерам, число копий и напечатанных страниц. Проблема в том, что во время запроса требуется выявить именно последние значения итемов по метке времени, которые есть в базе, поиск по таблице истории (она большая). Для этого в запросе есть вложенный запрос, который справляется со своей задачей, но очень медленно. Цена такого подзапроса слишком велика для меня. База большая, 500gb+, postgresql 11. Я ищу другие решения для вложенного запроса, который выберет последние значения. Проблемный вложенный запрос
Код:
select max(os2.clock) from history_uint os2 where os2.itemid = uint.itemid and os2.clock <= extract(epoch from now()) and os2.clock > extract(epoch from (CURRENT_DATE - INTERVAL '5' DAY)) Запрос полностью
HTML код:
select Буду рад любым идеям, которые помогут облегчить и ускорить запрос. |
В общем любой запрос с фильтром в таблицу history_uint оказывался слишком долгим. Поэтому решил сделать мат вьюху запросом, где сначала отсортировал по дате, потом ограничил лимитом до 200 лямов строк (столько примерно прибывает за пару дней). А потом уже по готовой мат вьюхе искал нужные значения.
Код:
CREATE*MATERIALIZED*VIEW*prn_rep*AS* Код:
clock = (select max(os2.clock) from prn_rep os2 where os2.itemid = uint.itemid) |
Нашлось правильное решение. У меня в базе есть партиционирование по датам. И explain показывал, что запрос перебирал все партиции, хотя должен был только несколько. В общем сделал правильное ограничение по дате и все залетало! Выполняется за 2-3 минуты.
Конечный запрос
Код:
SELECT split_part(hosts.host::text, ' '::text, 1) AS op, |
Время: 15:37. |
Время: 15:37.
© OSzone.net 2001-