Pull to refresh

Comments 12

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


В своём решении не стал в трассировку включать события с кодом 13 SQL:BatchStarting, в них не нашел полезной информации для профилирования.


Но включил:


  • 162. User Error Message
  • 148. Deadlock Graph

См. https://github.com/polarnik/SQLProfilerReportHelper/blob/master/scripts/start%20trace/Script.01.Start%20trace.sql


Особенностью https://habrahabr.ru/company/npo-comp/blog/243587/ является группировка запросов по текстам, самодельная. Позже научился группировать по query_stats.query_hash, как сделано в текущем решении. Группировка по query_hash это сто шагов вперёд. В проект пока не включено. Надо новый проект сделать для такого способа.


И собираю данные в одну таблицу. Чтобы потом сделать по ней один отчёт в Excel, с раскраской. Как раз вчера сел за доработку проекта, чтобы отчёт Excel формировался сразу из программы.


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

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

Спасибо за отзыв.


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


Запускаю трассировку по двум базам данных сразу — tempdb и целевой базе данных, tempdb активно используется внутри хранимок. Назвать реальных примеров, когда это было полезным не смогу, но когда-то решил так делать и делаю до сих пор.


И таблицу с результатами профайлинга создаю в отдельной БД, целевая база данных остаётся неприкосновенной. В текущей статье таблица TraceTable создаётся в целевой базе данных. Она обычно на отдельном диске, а tempdb на отдельном, создаю traceDB на том же диске, что и tempdb, чтобы разделить нагрузку на железо. Чтобы в резервную копию не попадали лишние данные. И чтобы не рос лог транзакций целевой базы данных.


Заменил бы строки ИМЯ_БАЗЫ_ДАННЫХ.dbo.TraceTable на строки traceDB.dbo.TraceTable, где traceDB — отдельная база данных, только для трассировки, без лога транзакций, без резервных копий.


И таблицу профайлинга TraceTable создаю каждый раз новую, за счёт использования даты и времени в имени таблицы TraceTable_20161107_0150. Храню для истории, удаляю руками.


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

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

При создании представления для триггеров [srv].[vTriggerExecInfo] используется alias procedure_stats, на работу это не должно влиять. Читаю код: "Не запускал, но осужаю". Наверняка, код работает.

А чем не устраивают стандартные средва анализа производительности?
Для решения проблем с медленными запросами пока хватало Монитора актвности со списком Дорогих запросов
ну и далее план запроса, индексы циклы и т.п.
А как Вы выясняете, что запросы стали медленными? По факту от пользователей? Данное решение, которое я опубликовал, призвано заранее упреждать такие явления+всегда следить за системой и без участия администраторов.
В SQL Server Azure / SQL Server 2016 есть механизм Query Store, который гораздо надежнее и точнее ручного сбора данных раз в 5-10 минут. По сути он делает то же самое, что ваши самописные job-ы, но гораздо точнее (на уровне отдельных statement-ов, пишет статистику по каждому выполнению + использованный план), непрерывно, в фоне, не влияя при этом на производительность.
Спасибо за информацию)
У нас правда пока 2016 не используется, да и Enterprise не везде поставить можно из-за финансовой составляющей, но предложенный Вами метод в будущем хорошо бы сравнить, чтобы понимать откуда берутся такие цифры
не влияя при этом на производительность.

Как мне кажется, необходимо добавить «практически» не влияя на производительность, как минимум диск то Query Store использует :)
Кроме того Query Store появился с позднего 2014-2016, так же имеет
Max Size (MB): Specifies the limit for the data space that Query Store will take inside your database.
.
Вообщем решение автора может пригодиться.
Как будет Enterprise сравню
Возможно стандартное решение от Microsoft хорошее, но может быть не самым оптимальным и хранить много лишней информации.
Но в любом случае интересно.
Правда мне кажется из заказчиков, особенно закрытых систем, мало кто готов оплатить Enterprise-версию
у enterprise есть триал, так что можно потестить вполне легально… если, конечно, там нет ограничений на боевое применение
Sign up to leave a comment.

Articles