Проверка изменений в Таблицах (DB)

Started by VSS, June 17, 2015, 10:33:30 AM

Previous topic - Next topic

VSS

Всем привет!

Возникла задача определить превышает ли разница по времени между последними записями с определенным критерием в Таблице определенный интервал... Обновления в таблицу сыпятся иногда каждую секунду или даже по несколько записей в секунду, бывает правда перерыв.

Подскажите, пожалуйста, как бы лучше решить поставленную задачу?

Alex Kirhenshtein

Я бы возвращал время последней записи в виде unix timestamp (количество секунд) и потом сделал бы threshold с функцией delta.

Что-то типа:select extract(epoch from record_timestamp) from ... where ... order by record_timestamp desc limit 1

Запрос можно выполнять через DBQuery субагент: https://www.netxms.org/documentation/adminguide/subagents.html#dbquery

VSS

Quote from: Alex Kirhenshtein on June 17, 2015, 02:22:14 PM
Я бы возвращал время последней записи в виде unix timestamp (количество секунд) и потом сделал бы threshold с функцией delta.

Что-то типа:select extract(epoch from record_timestamp) from ... where ... order by record_timestamp desc limit 1

Запрос можно выполнять через DBQuery субагент: https://www.netxms.org/documentation/adminguide/subagents.html#dbquery

Спасибо за подсказку! А как часто проводить опрос через DBQuery. Получается чтобы не пропустить новую запись надо или хранить в какой-то переменной индекс предыдущей или опрашивать очень часто?

Alex Kirhenshtein

В данных, которые лежат в таблице – в них есть время добавления записи?

Alex Kirhenshtein

Ну и самое простое (если записи только добавляются) – delta по max:select count(*) from t1

VSS

Quote from: Alex Kirhenshtein on June 17, 2015, 03:30:50 PM
В данных, которые лежат в таблице – в них есть время добавления записи?

Да специально добавили дату, но вопрос в том как определить, что DBQuery вернул именно последнюю запись. Т.е. получается надо где-то хранить или время последнего получения или номер или количество объектов.

И еще не понятно как часто организовать опрос... ведь данные сыпятся в БД достаточно часто!

kozlov_ao

Quoteorder by record_timestamp desc
сортирует по дате

Quotelimit 1
вернет только одну запись

вот и получается последняя добавленная запись.

По поводу частоты. Реши для себя, какой промежуток между добавлениями для тебя критичен, с такой частотой и дергай.

VSS

Quote from: kozlov_ao on June 18, 2015, 08:52:51 AM
Quoteorder by record_timestamp desc
сортирует по дате

Quotelimit 1
вернет только одну запись

вот и получается последняя добавленная запись.

По поводу частоты. Реши для себя, какой промежуток между добавлениями для тебя критичен, с такой частотой и дергай.

Спасибо с частотой понятно, тут надо искать оптимальное значение, но похоже придется брать 1 секунда ведь чаще нельзя..

А по поводу последней записи я имел ввиду реальную последнюю запись, т.е. при выборке проверить что с прошлого раза это запись точно последняя, например, по индексу. Но похоже этого сделать не получится. Пока не нашел как вообще вернуть несколько результатов в одном DBQuery.

kozlov_ao

Возможно я не до конца понял, что ты хочешь...
Данный запрос вернет время добавления записи в секундах. Их и смотришь. Куда точнее и реальнее то? :)

VSS

Quote from: kozlov_ao on June 18, 2015, 09:10:04 AM
Возможно я не до конца понял, что ты хочешь...
Данный запрос вернет время добавления записи в секундах. Их и смотришь. Куда точнее и реальнее то? :)

Попробую расписать поподробнее. Есть таблица журнала в нее постоянно сыпятся события. Для событий есть поля Тип, Номер объекта, Значение события, Время возникновения . Задача стоит в том, что надо проверить что между двумя последними событиями в таблице для тип = "..." и номера = "..." и значение = "..." разница во времени возникновения не превысила интервал Х.

kozlov_ao

ну.. интервал Х = периоду опроса, делаешь запрос.. если последняя запись старее чем "интервал Х" - выплевываем аларм. Такой вариант не подходит? или нужно сравнение делать именно между существующими записями?

VSS

Quote from: kozlov_ao on June 18, 2015, 09:38:00 AM
ну.. интервал Х = периоду опроса, делаешь запрос.. если последняя запись старее чем "интервал Х" - выплевываем аларм. Такой вариант не подходит? или нужно сравнение делать именно между существующими записями?

да, сравнение нужно делать именно между существующими записями и получается что опрос нужно делать для записей у которых разное поле значение = "ON" и значение = "OFF".

Появилась идея сделать запрос в котором объединить несколько полей в один результат а потом как-то выкрутить при помощи Transformation скрипта .... ?

kozlov_ao

ну тогда тебе 2 DCI надо:
1. получает последнее значение для ON
2. получает последнее значение для OFF и в Transformation Script вычислять разницу между $1 и значением из п.1

VSS

Quote from: kozlov_ao on June 18, 2015, 10:58:38 AM
ну тогда тебе 2 DCI надо:
1. получает последнее значение для ON
2. получает последнее значение для OFF и в Transformation Script вычислять разницу между $1 и значением из п.1

Спасибо, будем пробовать!

Я же правильно понял что из DBQuery невозможно вернуть несколько результатов, т.е. в скрипте есть только $1?

kozlov_ao