Используйте SQL Server Profiler (в меню инструментов в SSMS), чтобы создать трассировку, которая регистрирует эти события:
RPC:Completed
SP:Completed
SP:StmtCompleted
SQL:BatchCompleted
SQL:StmtCompleted
Вы можете начать со стандартного шаблона трассировки и удалить его. Вы не указали, было ли это для конкретной базы данных или для всего сервера, если это для конкретных БД, включите столбец DatabaseID и установите фильтр для вашей БД (SELECT DB_ID('dbname')
). Убедитесь, что логический столбец данных Reads включен для каждого события. Установите трассировку для входа в файл. Если вы оставляете эту трассировку для выполнения в фоновом режиме без присмотра, рекомендуется установить максимальный размер файла трассировки, например, 500 МБ или 1 ГБ, если у вас достаточно места (все зависит от того, насколько активно сервер работает, поэтому тебе придется пососать и посмотреть).
Кратко запустите трассировку, а затем приостановите ее. Перейдите в Файл-> Экспорт-> Определение трассировки скрипта и выберите версию своей БД и сохраните в файл. Теперь у вас есть сценарий sql, который создает трассировку с гораздо меньшими издержками, чем при работе через графический интерфейс профилировщика. Когда вы запустите этот скрипт, он выведет идентификатор трассировки (обычно @ID=2
); запишите это.
Как только у вас есть файл трассировки (.trc) (либо трассировка завершена из-за достижения максимального размера файла, либо вы остановили беговую трассировку, используя
EXEC sp_trace_setstatus @ID, 0
EXEC sp_trace_setstatus @ID, 2
Вы можете загрузить трассировку в профилировщик или использовать ClearTrace (очень удобно) или загрузить ее в таблицу следующим образом:
SELECT * INTO TraceTable
FROM ::fn_trace_gettable('C:\location of your trace output.trc', default)
Затем вы можете запустить запрос для агрегирования данных, подобных этим:
SELECT COUNT(*) AS TotalExecutions,
EventClass, CAST(TextData as nvarchar(2000))
,SUM(Duration) AS DurationTotal
,SUM(CPU) AS CPUTotal
,SUM(Reads) AS ReadsTotal
,SUM(Writes) AS WritesTotal
FROM TraceTable
GROUP BY EventClass, CAST(TextData as nvarchar(2000))
ORDER BY ReadsTotal DESC
Как только вы определили дорогостоящие запросы, вы можете сгенерировать и проверить фактические планы выполнения.