31
Я построю свой профайлер! С гридами и кнопками! Алексей Ковалёв

Я построю свой профайлер!

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Я построю свой профайлер!

Я построю свой профайлер!

С гридами и кнопками!

Алексей Ковалёв

Page 2: Я построю свой профайлер!

Спонсоры

Page 3: Я построю свой профайлер!

SQL Trace: Что и зачем

Что?

Набор событий и данных, собранный

Database Engine.

Зачем?

Основное – что сейчас происходит на

сервере?

Собрать статистику выполнения

Page 4: Я построю свой профайлер!

Методы получения информации

DMV.

Стандартный SQL Profiler.

Server side trace.

Extended events.

И наконец! Профайлер под заказ!

Page 5: Я построю свой профайлер!

DMV!

Вы видите статистику выполнения!

Most executed/expensive queries, plans, so on….

Статистика – это круто.

Однако…

Page 6: Я построю свой профайлер!

Статистика

0

10

20

30

40

50

60

70

80

90

1 2 3 4 5 6 7 8 9 10 1112131415161718192021222324

Каков тип нагрузки?

Пакетная обработка?

Равномерная загрузка?

Рабочие часы?

Никто не знает

Обобщенная статистика

– не ответ, мы требуем

подробностей!

Page 7: Я построю свой профайлер!

Старый добрый профайлер!

Знакомый инструмент с хорошим UI

Выбор событий и данных

Фильтрация

Группировка

Сохранение трассы в таблицу/файл

Page 8: Я построю свой профайлер!

Server side trace

sp_trace_create/sp_trace_setevent

Быстрый и экономный способ

Пишет трасу в файл на диск, с rollover/black box

Результат можно читать профайлером или fn_trace_gettable

Однако….

Требует дополнительных ресурсов диска, CPU для чтения/анализа/визуализации результатов собранной трассы

Page 9: Я построю свой профайлер!

Что можно сделать с Server Side Trace

Мы можем читать трассы, так в чем же

дело?

Replay Markup Language – RML

ClearTrace

Любой инструмент с fn_trace_gettable() /

TraceFile

Page 10: Я построю свой профайлер!

Extended events

Продвинутая версия server side trace

Больше настроек

Дополнительные потребители событий

Additional event targets (not only files)

Ловит события, которые не ловит обычная

траса

Page 11: Я построю свой профайлер!

Так где же истина?

Никто не совершенен!

Ни одно из решений не устраивает нас на

все 100%

Page 12: Я построю свой профайлер!

Единственный выход

Сделай сам!

Page 13: Я построю свой профайлер!

Мы можем создать свой профайлер!

А зачем?

Гибкий и точный контроль трасы Продвинутое фильтрование

Продвинутые преобразования

Продвинутое группирование

Требуется меньше ресурсов Скользящее окно и раннее отбрасывание данных

Малые размеры

Page 14: Я построю свой профайлер!

Зачем изобретать велосипед?

Microsoft.SqlServer.Management.Trace

TraceTable

TraceFile

TraceServer

Page 15: Я построю свой профайлер!

Давайте же срочно кодить!

Трасу нужно:

Создать

Прочитать

Понять

Page 16: Я построю свой профайлер!

Создать и прочитать трасу

declare @ret int,@p1 intexec @ret = sp_trace_create @p1 output,1,NULL,NULL,NULLdeclare @on bitset @on = 1--13 - SQL:BatchStartingexec sp_trace_setevent @p1,13, 1, @on -- TextData

exec sp_trace_setevent @p1,13, 11, @on -- LoginName

exec sp_trace_setevent @p1,13, 12,@on -- SPID

exec sp_trace_setstatus @p1, 1

exec sp_trace_getdata @p1, 0

Page 17: Я построю свой профайлер!

А понять то как? Skip

Skip until 65526

EventClass 13 (0x0d) –

SQL:BatchStarting

Start record

1 – TextData, “exec sp_who”

11 – LoginName, “sa”

12 – SPID, 61

End record

Page 18: Я построю свой профайлер!

Вот и всѐ, ребята!

Page 19: Я построю свой профайлер!

Hello, trace!

Твой собственный

велосипед

профайлер!

Page 20: Я построю свой профайлер!

Что дальше?

Декодируем курсоры

Ловим планы отдельных запросов

Собираем статистику по параметрам

Логируем выполнение хранимых процедур

Да всѐ что угодно!

Page 21: Я построю свой профайлер!

Декодируем курсоры

Знакомая картинка, не так ли?

Так что всѐ таки происходит?

Кто-нибудь!

Сделайте что-нибудь!

Page 22: Я построю свой профайлер!

Декодируем курсоры

Вытаскиваем id курсора и мапим на текст запроса

Ищем текст запроса по карте id<->sql

Удаляем курсор из маппинга

sp_prepare/sp_prepexec

sp_execute/sp_fetch

sp_unprepare/sp_close

Page 23: Я построю свой профайлер!

Ловим план отдельного запроса

Например, планы

где reads > 100

Page 24: Я построю свой профайлер!

Логируем выполнение процедур Тот же принцип, что и при ловле

отдельного плана Ловим SP:Starting

Продолжаем ловитьпоследующие события

Пока не поймаем SP:Completed

Если набранная информация подпадает под критерий(например по reads или времени выполнения) –сохраняем результат

Отбрасываем накопленную информацию

Ждем следующего SP:Starting –и начинаем заново

Page 25: Я построю свой профайлер!

Собираем статистику по параметрам

Закон Парето: 20/80

20% значений используются в 80% запросов

Как собирать?

Ловим стейтмент

Разбираем его (regexp/парсер)

Извлекаем параметры и их значения

Собираем статистику

Page 26: Я построю свой профайлер!

Собираем детальную информацию

10 20 30 40 50 60 70 80 90 100

Распределение запросов по длительности

0-6 7-12 13-19 20-24

Распределение запросов по времени суток

GetBalance

PayDebt

CancelOrder

Окрестности запроса

Page 27: Я построю свой профайлер!

Техническая поддержка приложений

Автоматические или полуавтоматические

Сбор трасы

Сбор статистики выполнения

Соотнесения трасы запросов и счетчиков

производительности Windows

Page 28: Я построю свой профайлер!

Resources

http://msdn.microsoft.com/en-us/library/hh245121.aspx

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.trace.aspx

http://support.microsoft.com/kb/944837

https://expressprofiler.codeplex.com/

http://technet.microsoft.com/en-us/library/cc293613.aspx

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.transactsql.scriptdom.tsqlparser.aspx

Page 30: Я построю свой профайлер!

Спонсоры

Page 31: Я построю свой профайлер!

Спасибо!