Профилирование запросов к SQLite для Qt приложений

Очередная моя статья на Хабре. На этот раз мне потребовалось проанализировать запросы к SQLite в чужом проекте. Что из этого вышло читайте тут.

Реклама

Циклическая база данных

Циклическая база данных(Round-robin Database, RRD) — база данных, объём хранимых данных которой не меняется со временем, поскольку количество записей постоянно, в процессе сохранения данных они используются циклически. Как правило, используется для хранения информации, которая перезаписывается через равные интервалы времени.(wiki)

Не буду описывать RRDTools(wiki), лишь опишу для чего можно и нужно использовать циклические базы данных, и чем это лучше реляционной базы данных.

RRD имеет смысл применять, когда вам нужно наблюдать за множеством физических объектов и собирать различные метрики и консолидировать за различные интервалы времени(объем переданных данных или средняя нагрузка на канал связи за час, день, неделю, месяц) и быстро отобразить данные.

Достоинство RRD перед реляционной базой данных:

  • консолидация данных при записи(что быстрее чем обработка при извлечение);
  • удаление устаревших данных;
  • отсутствие индексов;
  • данные расположены на диске последовательно, а не в дереве.

Из недостатков:

  • отсутствие языка структурированных запросов.

Схема базы данных, для системы мониторинга

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

Какие функциональные требования относятся к системе мониторинга? Вот некоторая часть этих требований:

  • сбор измерений;
  • обработка измерений и вычисление показателей производительности, эффективности и т.д.;
  • информирование о нарушениях показателей.

data_modelУчаствующие сущности:

  • time_intervals таблица 15 минутных временных интервалов. Определяет период за который производилось наблюдение и за который поступили данные в систему;
  • qosraw.data_snmp таблица соответствующая способу получения измерений или по типу измерений. В данном случае SNMP, но может быть Netflow, CLI(Command Line Interface), ADSL и т.д. Еще это мастер таблица в терминах PostgreSQL;
  • qosraw.data_snmp_yyyy_MM_dd подчиненная таблица в терминах PostgreSQL.

time_intevals

Очень удобно временному интервалу задавать числовой идентификатор, во-первых это удобно, чем оперировать датами, во-вторых происходит привязка данных, рассчитанных показателей к конкретной временной точки, пример такой связи изображен на схеме.

Что дает нам такая связь? Имея ссылочную целостность в СУБД удалив временной интервал, мы удаляем все измерения и рассчитанные показатели за этот период времени.

qosraw.data_snmp

Таблицы с именем qosraw.data_XXX предназначены для хранения измерений по их происхождениям. В data_snmp хранятся метрики получаемые путем опроса объектов наблюдения по SNMP.

Описание полей:

  • time_id идентификатор временного интервала;
  • mid — measurement id идентификатор измерения: количество переданных пакетов, ошибок, нагрузка процессора, температура лазера и т.д.;
  • critid идентификатор критерия. Когда мы хотим отслеживать какую-то характеристику конкретного объекта, мы вешаем критерий и связываем его с типом измерения. К примеру ошибки на сетевом интерфейсе является типом измерения, может измерятся в пакетах или в % от обработанных пактов. В данном типу измерению «ошибки», соответствуют два измерения: ошибки в пакетах и ошибки в %;
  • value само значение.

Эта таблица в PostgreSQL(именно эту СУБД мы используем) является мастер таблицей при реализации партицирования таблиц и поэтому не содержит самих данных.

Партиционирование (partitioning) — это разбиение больших таблиц на логические части по выбранным критериям. Партиционированные или секционированные таблицы призваны улучшить производительность и управляемость базами данных.

qosraw.data_snmp_yyyy_MM_dd

Подчиненная таблица. Собственно она и содержит сами данные. Сделано это для повышение производительности. В одной тестовой зоне у заказчика происходит мониторинг 130 сетевых устройств, каждые 15 минут кладутся порядка 46 000 измерений, в такой дневной таблице получается порядка 4-5 миллионов измерений. Так что если все держать в одной таблице, что через месяц система начнет проседать.

Заключение

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

Для производительности системы мы агрегируем пятнадцатиминутные интервалы в часовые, дневные, недельные и месячные интервалы времени, для истории и дальнейшей аналитики и построения отчетов.