В процессе борьбы за живучесть MDM на RPi3, обнаружил один неприятный факт: optimizer показывает ~30 000 записей, а таблица phistory содержит 60 000. Причем первые записи относились к ноябрю 15 года, когда я только начинал экспериментировать с MDM. Они пережили два (!!!) переезда.
Понимаю, что скорее всего, это радиус кривизны моих рук. Сейчас уже и не понять как это произошло.
Я у себя удалил лишние записи:
Код: Выделить всё
DELETE phistory.* FROM phistory LEFT JOIN pvalues ON phistory.VALUE_ID = pvalues.id WHERE pvalues.id IS NULL
Просьба к Сергею добавить проверку в optimizer.
UPD1:
Думаю еще проверить по всем ли свойствам, которые хранятся в phistory в данный момент указано хранить историю...
Есть основания полагать, что не по всем)))
Давно уже есть мысль сделать отдельный класс, который следит за 'косяками' в базе. Но пока те проблемы, которые находил и исправлял больше не повторялись или оказались совсем не проблемами)))
А так могут быть еще, и скорее всего, есть:
- непривязанные методы, свойства;
- дубликаты свойств (определенные на уровне объекта и класса). Например, что будет, если от ESP прилетела новая переменная, а ты ее решил переопределить на уровне класса чтобы хранить историю? И/или старый глюк, я нем писал: в определенных ситуациях переменная может писаться в один экземпляр свойства, а считываться из другого.
- дубликаты методов (В X-Ray->Structure часть из их можно случайно увидеть)
UPD2:
Код: Выделить всё
SELECT h.VALUE, h.ADDED, v.PROPERTY_NAME, p.TITLE AS pName, p.KEEP_HISTORY, o.TITLE AS oTITLE
FROM phistory AS h
LEFT JOIN pvalues AS v ON h.VALUE_ID = v.ID
LEFT JOIN properties AS p ON v.PROPERTY_ID = p.ID
LEFT JOIN objects AS o ON v.OBJECT_ID = o.ID
WHERE p.KEEP_HISTORY <1
UPD3:

- keep_history.jpg (37.47 КБ) 8595 просмотров
Код: Выделить всё
SELECT h.VALUE, h.ADDED, v.PROPERTY_NAME, p.TITLE AS pName, p.KEEP_HISTORY, o.TITLE AS oTITLE
FROM phistory AS h
LEFT JOIN pvalues AS v ON h.VALUE_ID = v.ID
LEFT JOIN properties AS p ON v.PROPERTY_ID = p.ID
LEFT JOIN objects AS o ON v.OBJECT_ID = o.ID
WHERE p.KEEP_HISTORY=1
AND h.ADDED<"2017-02-06 23:00:00"
UPD4:
Код: Выделить всё
SELECT h.VALUE, h.ADDED, v.PROPERTY_NAME, p.TITLE AS pName, p.KEEP_HISTORY, o.TITLE AS oTITLE FROM phistory AS h LEFT JOIN pvalues AS v ON h.VALUE_ID = v.ID LEFT JOIN properties AS p ON v.PROPERTY_ID = p.ID LEFT JOIN objects AS o ON v.OBJECT_ID = o.ID WHERE p.KEEP_HISTORY>0 AND UNIX_TIMESTAMP(h.ADDED)<UNIX_TIMESTAMP()-p.KEEP_HISTORY*60*60*24
Итог: 50 000 записей из первоначальных 60 000 (83% мусора)
UPD5: Если я правильно понимаю:
- при изменении к.л. свойства сначала проиcходит запись в phistory_queue. Затем скопившиеся в phistory_queue записи разгребаются в cycle_main, отдельным циклом. В том числе, (только по свежесохраненным записям) чистится таблица phistory.
- Т.е. если мы перестали писать значения конкретного свойства, то и история перестала (!) очищаться. Объекта уже может и не быть в системе, но история его будет вечна!)))).
Я, конечно, всего кода системы не обозрел - может где-то и предполагается более строгая чистка истории, но итог выше говорит сам за себя. Придется добавить в регулярный запуск:
Код: Выделить всё
DELETE h FROM phistory AS h
LEFT JOIN pvalues AS v ON h.VALUE_ID = v.ID
LEFT JOIN properties AS p ON v.PROPERTY_ID = p.ID
WHERE (p.KEEP_HISTORY>0 AND UNIX_TIMESTAMP(h.ADDED)<UNIX_TIMESTAMP()-p.KEEP_HISTORY*60*60*24) OR (p.KEEP_HISTORY<1)