直接执行如下SQL查询:
SELECT
TOP 20 total_worker_time / 1000 AS [总消耗CPU 时间(ms)],
execution_count [运行次数],
qs.total_worker_time / qs.execution_count / 1000 AS [平均消耗CPU 时间(ms)],
last_execution_time AS [最后一次执行时间],
max_worker_time / 1000 AS [最大执行时间(ms)],
SUBSTRING(
qt.text,
qs.statement_start_offset / 2 + 1,
(
CASE WHEN qs.statement_end_offset = - 1 THEN DATALENGTH(qt.text) ELSE qs.statement_end_offset END - qs.statement_start_offset
)/ 2 + 1
) AS [使用CPU的语法],
qt.text [完整语法],
dbname = db_name(qt.dbid),
object_name(qt.objectid, qt.dbid) ObjectName
FROM
sys.dm_exec_query_stats qs WITH(nolock) CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE
execution_count > 1 ORDER BY max_worker_time DESC
其中[使用CPU的语法] 是指具体耗时较长的SQL。如果耗时长的SQL在存储过程中,ObjectName 是存储过程的名称。dbname是对应的数据库。
上述的排序是根据总耗时,total_worker_time来进行排序。如果是针对具体的SQL语句(忽略执行次数),可以根据 [平均消耗CPU 时间(ms)] 来进行排序,更准确的找到应该优化的SQL。