Я нашел длинные сложные инструкции как это при поиске ответа на этот вопрос краткие справочные ссылки, например, в эта почта.
Я ищу краткую процедуру, насколько это возможно для создания списка SQL-запросов со временем выполнения, где время выполнения> some_threshold.
Думаю, ответа здесь не было, потому что это так просто! Вот что я выяснил:
File -> New Trace...
RPC:Completed
SQL:BatchCompleted
Вы можете фильтровать по ApplicationName
, NTUserName
и т. д., если у вас работает много приложений и вы хотите снизить уровень шума. Вы также можете показать только некоторые столбцы, например просто TextData
и Duration
.
Вот гораздо более продвинутое лечение Профилировщика.
вы можете использовать это, чтобы получить 10 самых дорогих запросов (если вы используете Sql server 2005 и выше):
SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1),
qs.execution_count,
qs.total_logical_reads, qs.last_logical_reads,
qs.total_logical_writes, qs.last_logical_writes,
qs.total_worker_time,
qs.last_worker_time,
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
qs.last_execution_time,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_logical_reads DESC -- logical reads
-- ORDER BY qs.total_logical_writes DESC -- logical writes
-- ORDER BY qs.total_worker_time DESC -- CPU time
Использование трассировки Profiler, особенно при импорте трассировки в базу данных, является отличной методологией.
Если вы используете SQL Server 2005 или новее, DMV (динамические управленческие представления) предлагают альтернативную методологию:
SELECT TOP 100
(total_logical_reads + total_logical_writes) / qs.execution_count AS average_IO,
(total_logical_reads + total_logical_writes) AS total_IO,
qs.execution_count AS execution_count,
SUBSTRING (qt.text,qs.statement_start_offset/2,
(CASE WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) AS indivudual_query,
o.name AS object_name,
DB_NAME(qt.dbid) AS database_name
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
LEFT OUTER JOIN sys.objects o ON qt.objectid = o.object_id
where qt.dbid = DB_ID()
ORDER BY average_IO DESC;
Следует помнить, что DMV очищаются при запуске SQL Server, поэтому, если ваш сервер работал в течение 12 минут, он может мало что вам сказать. Кроме того, они кумулятивны, поэтому окна обслуживания (checkDB) могут исказить данные.