Иногда в докладах/статьях по оптимизации производительности СУБД, описание предлагаемой методики/средства начинается с события -«мы заметили резкое увеличение времени выполнения запроса/запросов и резкое увеличение количества прочитанных блоков разделяемой области«. Далее следует описание процесса выявления ресурсоёмкого запроса, с целью его оптимизации.
На этапе разработки данных сценарий вполне себя оправдывает . Нагрузка на СУБД — детерминирована, характер нагрузки определён и описан, распрелеление данных неизменны. При условии адекватности команды разработки, даже удастся действительно оптимизировать запрос.
Но.
В процессе промышленной эксплуатации ситуация меняется принципиально и кардинально.
-
Нагрузка на СУБД меняется в самых широких диапазонах , и носит случайный характер.
-
Характер, объем и статистическая картина распределения данных очень изменчива .
-
Влияние инфраструктуры в общем случае — непредсказуемо.
-
Входные данные запросов меняются в самых широких пределах.
-
Изменить код запроса в общем случае нет никакой возможности, как минимум — очень затруднено .
-
Сопровождение системы со стороны разработчиков как правило уже отсутствует.
И это порождает существенные проблемы:
1) А как определить , что производительность конкретного запроса деградировала ?
2) Что является метрикой производительности запроса ? Максимальное время , среднее время , минимальное , стандартная ошибка ?
3) Как оценить производительность запроса на разных входных данных ? В одном случае запрос обрабатывает X строк и выполняется за время x, в другом случае запрос отрабатывает Y строк и выполняется за время y. Можно ли сказать , что есть деградация производительности выполнения (y > x) , если Y существенно больше X ?
4) Как оценить производительность запроса при разной нагрузке на инфраструктуру и информационную систему.
Таким образом , проблему можно сформулировать примерно так :
-
Можно собрать историю показателей выполнения запроса(группы запросов) за сколь угодно необходимый период времени. Инструментов более чем достаточно.
-
Как проанализировать собранные данные ?
-
Какие ожидания от результата анализа?
Update.
Уже после публикации, возникла мысль — применить для мониторинга производительности SQL запроса метрику для оценки производительности СУБД:
https://habr.com/ru/posts/804899/
Конечно, с некоторыми изменениями, для расчета метрики.
1)Использовать вектор N для расчета производительности .
-
n1-количество прочитанных блоков распределенной области в секунду.
-
n2-количество записанных блоков распределённой области в секунду.
-
n3-количество изменённых блоков распределённой области в секунду.
2)Значением метрики будет являться отношение модуля вектора N к общему времени выполнения запроса за промежуток времени (total_exec_time).
В этом случае можно сравнить производительность запроса при разных входных данных и разных объёмах обрабатываемой информации. И затем применить статистические методы для корреляционного анализа с производительностью СУБД .
ссылка на оригинал статьи https://habr.com/ru/articles/827156/
Добавить комментарий