Мониторинг производительности отдельного SQL запроса

Иногда в докладах/статьях по оптимизации производительности СУБД, описание предлагаемой методики/средства начинается с события -"мы заметили резкое увеличение времени выполнения запроса/запросов и резкое увеличение количества прочитанных блоков разделяемой области". Далее следует описание процесса выявления ресурсоёмкого запроса, с целью его оптимизации.

Самый главный вопрос, по данному сценарию - а почему считается , что скачок количества прочитанных блоков это инцидент требующий анализа?

На этапе разработки данных сценарий поиска ресурсоемких запросов, возможно, вполне себя оправдывает . Нагрузка на СУБД - детерминирована, характер нагрузки определён и описан, картина распределения данных неизменна. При условии адекватности команды разработки, возможно даже удастся действительно оптимизировать запрос.

Но.

В процессе промышленной эксплуатации ситуация меняется принципиально и кардинально.

  1. Нагрузка на СУБД меняется в самых широких диапазонах , и носит случайный характер.

  2. Характер, объем и статистическая картина распределения данных очень изменчива .

  3. Влияние инфраструктуры в общем случае - непредсказуемо.

  4. Входные данные запросов меняются в самых широких пределах.

  5. Изменить код запроса в общем случае нет никакой возможности, как минимум - очень затруднено .

  6. Сопровождение системы со стороны разработчиков как правило уже отсутствует.

И эта ситуация порождает существенные вопросы :

1) Самый главный вопрос - что является метрикой производительности запроса ? Максимальное время , среднее время , минимальное , стандартная ошибка ?

2) А как определить , что производительность конкретного запроса деградировала ?

3) Как оценить производительность запроса на разных входных данных ? В одном случае запрос обрабатывает X строк и выполняется за время t1, в другом случае запрос обрабатывает Y строк и выполняется за время t2. Можно ли сказать , что есть деградация производительности выполнения , если Y существенно больше X и t2 больше t1?

4) Как оценить производительность запроса при разной нагрузке на инфраструктуру и информационную систему.

Таким образом , в общем виде, проблему можно сформулировать следующим образом:

  1. Можно собрать сколь угодно объёмную историю различных показателей выполнения запроса(группы запросов) за сколь угодно необходимый период времени. Инструментов более чем достаточно.

  2. Как проанализировать собранные данные ?

  3. Какие ожидания от результата анализа?

Update.

Уже после публикации, возникла мысль - применить для мониторинга производительности SQL запроса метрику для оценки производительности СУБД:

https://habr.com/ru/posts/804899/

Конечно, с некоторыми изменениями, для расчета метрики.

1)Использовать вектор N для расчета производительности:

2)Значением метрики будет являться отношение модуля вектора N к общему времени выполнения запроса за промежуток времени (total_exec_time).

В этом случае можно сравнить производительность запроса при разных входных данных и разных объёмах обрабатываемой информации. И затем применить статистические методы для корреляционного анализа с производительностью и метриками СУБД .

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

Предположу, что функция зависимости времени выполнения запроса от количества обработанных строк - нелинейна . Более того , вряд ли можно говорить о том, что существует функция времени выполнения запроса по количеству строк. Характер распределения данных может быть сильно разный => план выполнения запроса будет разный . И вообще, одно и тоже количество результирующих строк, может потребовать разное время для получения результата, даже в идеальных тестах, не говоря уже о продуктиве.

Возможно , потребуется дополнить вектор N новыми измерениями.

@rinace
07.07.2024 14:26 UTC
Первоисточник

Комментарии

@Grigory_Otrepyev
07.07.2024 09:35 UTC
+3

Таким образом , проблему можно сформулировать примерно так :

И на этом все?

То есть рассказа о богоравном SHOWPLAN  и стоимости операций не будет ?

В процессе промышленной эксплуатации ситуация меняется принципиально и кардинально.

  1. Нагрузка на СУБД меняется в самых широких диапазонах , и носит случайный характер.

Чего чего?? У вас программа меняется сама по себе и внутри ее меняется тот селект, который сделали разработчики ??

@
07.07.2024 09:39 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
@Grigory_Otrepyev
07.07.2024 09:41 UTC
+2

Дальше нужно писать система кеширования на стороне сервера.

индексы нормально делать не пробовали, а не "поиграться" ?

А сидеть оптимизировать запрос это рехнуться можно, бд не для этого создавались

А для чего ????

Да никак ( Можно поиграться с индексами, нормализацией - на этом всё.

Или взять нормальную СУБД, у которой блокировки не ставят раком всю базу. Любую из .. трех или пяти.

07.07.2024 10:33 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
07.07.2024 16:11 UTC
+1

Вообще-то нет. Разработчик определяет структуру хранения данных, индексы и сам запрос. СУБД, создавая план запроса, может подстраиваться в очень узких пределах, и, как правило, если этот план отличается от того, что представляет себе разработчик, то либо косяки с индексами, либо косяки с запросом, ну или косяки с данными и хранить их надо по-другому, в другой структуре.

Ну а если разработчик делая запрос не представляет, как этот запрос будет (или должен в его представлении) выполняться, то это очень грустно. Лучшеб ему подтянуть знания. Ибо там все очень просто и элементарно. Просто чуть-чуть знаний алгоритмической сложности структур, в которых хранятся данные в СУБД, чуть-чуть знаний алгоритмической сложности операций, которые СУБД применяет для выборки данных и для соединений, немножко здравого смысла и немножко практики.

07.07.2024 16:26 UTC
0

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

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

https://learn.microsoft.com/en-us/sql/tools/sql-server-profiler/sql-server-profiler?view=sql-server-ver16

07.07.2024 17:31 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
@rinace
07.07.2024 09:42 UTC
-1

Согласен . Именно к такой мысли прихожу .

@Kerman
07.07.2024 09:56 UTC
+6

бд достаточно умна

Неа. БД не в курсе про ваши сценарии использования данных. У неё свои представления о прекрасном. Она не знает, когда надо дропнуть кэш, она не угадает, какие данные надо предварительно закешировать, она не в курсе, что вот этот тяжёлый запрос нужен раз в полгода.

07.07.2024 10:03 UTC
-3

она не в курсе, что вот этот тяжёлый запрос нужен раз в полгода.

но ведь .. можно его брать из реплики ... ??? ведь база же могла сама угадать, что ей нужна реплика и перенаправить запрос туда?? ))))))))))))))))))))

07.07.2024 10:41 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
@alexdora
07.07.2024 12:15 UTC
0

Нормализация включает в себя индексы это раз.

Второе, я сталкивался с ситуацией где в инженеры СУБД уменьшали утилизацию CPU в 10-ки раз делая в SQL-запросе вложение которое «обманывала» сборщик кэша и прочее. Поэтому если я или к примеру вы знаем СУБД на уровне простейших селект/инсерт, то не стоит считать что больше вариаций никаких нет.

@RmExevil
07.07.2024 12:18 UTC
0

Не согласен. Есть и другие подходы. Перевод чтения на стенд-бай, добавление партиций, разделение данные на ноды, разделение на горячие и холодные данные. С точки зрения расширения пропускной способности базы, там можно обыграть по разному. В нашем случае, даже просто сохранение батчами начало помогать)

07.07.2024 12:23 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
@tonx92
07.07.2024 12:24 UTC
+1

На хабре любят минусить за здравый смысл.

Поможет только одно. Кэши и оптимизация запросов на стороне приложений.

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

07.07.2024 13:46 UTC
0

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

07.07.2024 16:28 UTC
0

Поможет только одно. Кэши и оптимизация запросов на стороне приложений.

дичь полная. у MS SQL , DB2 и Oracle RAC огромное число настроек и метрик. Крутить надо везде, и на всех маршруте от запроса до процесса исполнения запроса. для этого есть разный мониторинг. но это уже надо думать и даже звать админов.

@BugM
07.07.2024 10:04 UTC
+1

Вы мониторинги делать не пробовали? Все нормальные БД умеют логировать медленные запросы. Критерий медленности можно настроить.

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

Сверху стоит прикрутить мониторинг медианы времени выполнения и нагрузки на ЦПУ с дисками. Так вы увидите общее просаживание производительности. И будет вообще хорошо.

@rinace
07.07.2024 10:18 UTC
-1

мониторинг медианы времени выполнения и нагрузки на ЦПУ с дисками. Так вы увидите общее просаживание производительности. 

Просаживание производительности чего ? Инфраструктуры или СУБД ?

07.07.2024 11:20 UTC
0

Сервера на котором у вас БД крутится. Причины могут быть разными, этот мониторинг просто покажет что проблема есть.

@Grigory_Otrepyev
07.07.2024 16:29 UTC
+1

Вы мониторинги делать не пробовали? Все нормальные БД умеют логировать медленные запросы.

s/ глупости говорите. вы так дойдете до того, что надо читать документацию по бест практик самой базы.

@zubrbonasus
07.07.2024 11:41 UTC
0

Существует понятие "эталонные тесты". Эталонные тесты это некоторый набор запросов составленный для тестирования бд.

Принцип использования такой: запускаем тесты, получаем результат выполнения запросов, анализируем проблемные моменты (запросы которые выполняются долго), оптимизируем структуру и запросы, запускаем эталонные тесты и сравниваем результаты, потом все с начала.

Ожидания от выполнения запросов можно определить так: "команда разработчиков считает что страница веб сервиса должна открыться за 300 ms.", - чтобы удовлетворить это ожидание данные должны появиться на фронте за ~75 ms. Под эти ожидания пишем запрос(ы) учитывая объем данных в таблице (их может быть много).

У СУБД также есть хорошие инструменты: лог долгих запросов, лог запросов, лист процессов, журнал репликации и др.

Эти инструменты также важны в работе с бд.

Ну как-то так.

@rinace
08.07.2024 04:45 UTC
0

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

Никто ни архитектор , ни менеджер, никто из разработчиков не знает цифр

 "команда разработчиков считает что страница веб сервиса должна открыться за 300 ms.", - чтобы удовлетворить это ожидание данные должны появиться на фронте за ~75 ms.

Далее , они не пишут запросы

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

Они используют фреймворки и ORM.

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

В реальной жизни всё происходит сильно не по книжкам.

@Tzimie
07.07.2024 12:07 UTC
0

Query store? Специальный отчет по деградировавшим запросам? Нет, не слышал.

ПыСы. Разумеется это не серебряная пуля

@rinace
08.07.2024 04:36 UTC
0

отчет по деградировавшим запросам

Какая метрика является показателем деградации запроса ?

Например запрос выдавал 10 строк и выполнялся 10ms. Запрос выдает 10000 строк и выполняется секунду .

Можно говорить о деградации запроса ?

А если первая цифра получена при 50 активных сессиях, а вторая при 600?

08.07.2024 07:51 UTC
0

В query store и это видно. Хотя, как я говорил, это не серебряная пуля