对于SQL Server的慢SQL信息排查,我们可以利用一些系统自带的统计信息表来帮助我们进行问题SQL定位。
该表记录了SQL Server中相关的执行计划的统计信息,从该表中我们可以从不同的维度分析是否存在一些资源消耗较大的SQL。
重点关注字段及其含义:
根据sql_handle的标识来查看对应的SQL文本,查询语句如下:
sys.dm_exec_sql_text(sql_handle | plan_handle)
1、查找平均CPU时间消耗 TOP N 查询
SELECT TOP 5 query_stats.query_hash AS "Query Hash",
SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS "Avg CPU Time",
MIN(query_stats.statement_text) AS "Statement Text"
FROM
(SELECT QS.*,
SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(ST.text)
ELSE QS.statement_end_offset END
- QS.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS QS
CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats
GROUP BY query_stats.query_hash
ORDER BY 2 DESC;
2、查找平均查询耗时 TOP N 查询
SELECT TOP 5 query_stats.query_hash AS "Query Hash",
SUM(query_stats.total_elapsed_time) / SUM(query_stats.execution_count) AS "Avg Query Time",
MIN(query_stats.statement_text) AS "Statement Text"
FROM
(SELECT QS.*,
SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(ST.text)
ELSE QS.statement_end_offset END
- QS.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS QS
CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats
GROUP BY query_stats.query_hash
ORDER BY 2 DESC;
3、查看指定sql_handle对应的SQL语句
SELECT * FROM sys.dm_exec_sql_text(${sql_handle}) -- modify this value with your actual sql_handle
4、利用cross apply结合其他系统表查看问题SQL信息
select DB_NAME(t.dbid),t.text,r.status,r.start_time,r.command,r.session_id,r.wait_time,r.last_wait_type
from sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
where r.database_id=DB_ID('nuskincsm')