Griboed0ff
23-11-2022, 16:56
Доброго времени суток!
Создал запрос в базу заббикса, который выводит мне отчет по принтерам, число копий и напечатанных страниц. Проблема в том, что во время запроса требуется выявить именно последние значения итемов по метке времени, которые есть в базе, поиск по таблице истории (она большая). Для этого в запросе есть вложенный запрос, который справляется со своей задачей, но очень медленно. Цена такого подзапроса слишком велика для меня. База большая, 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))
select
split_part(hosts.host, ' ', 1) as OP,
hosts.hostid as id,
reverse(split_part(hosts.description, 'SN:', 2)) as serial,
split_part(split_part(hosts.description, ',', 1), ':', 2) as model,
hosts.host as hostname,
ip.ip as ip,
abstime(uint.clock)::timestamp as datetime,
(CURRENT_DATE - INTERVAL '1' DAY)::date as date_values,
uint.value as count_copy,
CASE
WHEN items.key_ in ('page_copy_2', 'page_copy_1') THEN 'page_copy'
WHEN items.key_ in ('page_counter') THEN 'page_counter'
END AS type
from
interface as ip,
history_uint as uint,
hosts as hosts,
items as items
where
hosts.hostid=items.hostid
and hosts.hostid=ip.hostid
and items.key_ in ('page_copy_2', 'page_copy_1', 'page_counter')
and items.itemid=uint.itemid
and clock = (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)) )
Буду рад любым идеям, которые помогут облегчить и ускорить запрос.
Создал запрос в базу заббикса, который выводит мне отчет по принтерам, число копий и напечатанных страниц. Проблема в том, что во время запроса требуется выявить именно последние значения итемов по метке времени, которые есть в базе, поиск по таблице истории (она большая). Для этого в запросе есть вложенный запрос, который справляется со своей задачей, но очень медленно. Цена такого подзапроса слишком велика для меня. База большая, 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))
select
split_part(hosts.host, ' ', 1) as OP,
hosts.hostid as id,
reverse(split_part(hosts.description, 'SN:', 2)) as serial,
split_part(split_part(hosts.description, ',', 1), ':', 2) as model,
hosts.host as hostname,
ip.ip as ip,
abstime(uint.clock)::timestamp as datetime,
(CURRENT_DATE - INTERVAL '1' DAY)::date as date_values,
uint.value as count_copy,
CASE
WHEN items.key_ in ('page_copy_2', 'page_copy_1') THEN 'page_copy'
WHEN items.key_ in ('page_counter') THEN 'page_counter'
END AS type
from
interface as ip,
history_uint as uint,
hosts as hosts,
items as items
where
hosts.hostid=items.hostid
and hosts.hostid=ip.hostid
and items.key_ in ('page_copy_2', 'page_copy_1', 'page_counter')
and items.itemid=uint.itemid
and clock = (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)) )
Буду рад любым идеям, которые помогут облегчить и ускорить запрос.