SELECT TOP 10 GETDATE() runtime, *FROM (
SELECT query_stats.query_hash,
SUM (query_stats.cpu_time) 'Total_Request_Cpu_Time_Ms',
SUM (logical_reads) 'Total_Request_Logical_Reads',
MIN (start_time) 'Earliest_Request_start_Time',
COUNT (*) 'Number_Of_Requests',
SUBSTRING (REPLACE(REPLACE(MIN (query_stats.statement_text),CHAR (10),' '),CHAR (13),' '),1,256) AS "Statement_Text" FROM (
SELECT req.*,
SUBSTRING (ST.text,(req.statement_start_offset /2)+1,((CASE statement_end_offset WHEN-1THEN DATALENGTH(ST.text) ELSE req.statement_end_offset END-req.statement_start_offset)/2)+1) AS statement_text
FROM sys.dm_exec_requests AS req CROSS APPLY sys.dm_exec_sql_text (req.sql_handle) AS ST) AS query_stats
GROUPBY query_hash) AS t
ORDERBY Total_Request_Cpu_Time_Ms DESC;
查看前X个CPU消耗查询(按会话)
PRINT '--top 10 Active CPU Consuming Queries by sessions--';
SELECT TOP 10 req.session_id,req.start_time,cpu_time 'cpu_time_ms',OBJECT_NAME(ST.objectid,ST.dbid) 'ObjectName',
SUBSTRING (REPLACE(REPLACE(SUBSTRING (ST.text,(req.statement_start_offset /2)+1,((CASE statement_end_offset WHEN-1THEN DATALENGTH(ST.text) ELSE req.statement_end_offset END-req.statement_start_offset)/2)+1),CHAR (10),' '),CHAR (13),' '),1,512) AS statement_text
FROM sys.dm_exec_requests AS req CROSS APPLY sys.dm_exec_sql_text (req.sql_handle) AS ST
ORDERBY cpu_time DESC;
GO
历史发生
统计某个时间段内前X CPU耗时查询
DECLARE@numsint=15;
DECLARE@beginTime datetime2 = DATEADD(DAY, -1,GETUTCDATE());
DECLARE@endTime datetime2 = GETUTCDATE();
WITH AggregatedCPU AS (
SELECT q.query_hash,
SUM (count_executions*avg_cpu_time/1000.0) AS total_cpu_millisec,
SUM (count_executions*avg_cpu_time/1000.0)/SUM (count_executions) AS avg_cpu_millisec,
MAX (rs.max_cpu_time /1000.00) AS max_cpu_millisec,
MAX (max_logical_io_reads) max_logical_reads,
COUNT (DISTINCT p.plan_id) AS number_of_distinct_plans,
COUNT (DISTINCT p.query_id) AS number_of_distinct_query_ids,
SUM (CASEWHEN rs.execution_type_desc='Aborted'THEN count_executions ELSE0END) AS Aborted_Execution_Count,
SUM (CASEWHEN rs.execution_type_desc='Regular'THEN count_executions ELSE0END) AS Regular_Execution_Count,
SUM (CASEWHEN rs.execution_type_desc='Exception'THEN count_executions ELSE0END) AS Exception_Execution_Count,
SUM (count_executions) AS total_executions,MIN (qt.query_sql_text) AS sampled_query_text
FROM sys.query_store_query_text AS qt
JOIN sys.query_store_query AS q ON qt.query_text_id=q.query_text_id
JOIN sys.query_store_plan AS p ON q.query_id=p.query_id JOIN sys.query_store_runtime_stats AS rs ON rs.plan_id=p.plan_id
JOIN sys.query_store_runtime_stats_interval AS rsi ON rsi.runtime_stats_interval_id=rs.runtime_stats_interval_id
WHERE rs.execution_type_desc IN ('Regular','Aborted','Exception') AND rsi.start_time>=@beginTimeAND rsi.start_time <@endTimeAND count_executions >1GROUPBY q.query_hash),OrderedCPU AS (
SELECT query_hash,
total_cpu_millisec,
avg_cpu_millisec,
max_cpu_millisec,
max_logical_reads,
number_of_distinct_plans,
number_of_distinct_query_ids,
total_executions,Aborted_Execution_Count,
Regular_Execution_Count,Exception_Execution_Count,
sampled_query_text,ROW_NUMBER () OVER (ORDERBY total_cpu_millisec DESC,query_hash ASC) AS RN
FROM AggregatedCPU)
SELECT OD.query_hash,OD.total_cpu_millisec,OD.avg_cpu_millisec,OD.max_cpu_millisec,OD.max_logical_reads,OD.number_of_distinct_plans,OD.number_of_distinct_query_ids,OD.total_executions,OD.Aborted_Execution_Count,OD.Regular_Execution_Count,OD.Exception_Execution_Count,OD.sampled_query_text,OD.RN
FROM OrderedCPU AS OD
WHERE OD.RN <=@numsORDERBY avg_cpu_millisec DESC;
IO性能问题
当前发生
查看一个小时内每15S , IO使用情况
SELECT end_time, avg_data_io_percent, avg_log_write_percent
FROM sys.dm_db_resource_stats
ORDERBY end_time DESC;
历史发生
统计时间段IO等待情况
-- top queries that waited on buffer-- note these are finished queriesWITH Aggregated AS (SELECT q.query_hash, SUM(total_query_wait_time_ms) total_wait_time_ms, SUM(total_query_wait_time_ms / avg_query_wait_time_ms) AS total_executions, MIN(qt.query_sql_text) AS sampled_query_text, MIN(wait_category_desc) AS wait_category_desc
FROM sys.query_store_query_text AS qt
JOIN sys.query_store_query AS q ON qt.query_text_id=q.query_text_id
JOIN sys.query_store_plan AS p ON q.query_id=p.query_id
JOIN sys.query_store_wait_stats AS waits ON waits.plan_id=p.plan_id
JOIN sys.query_store_runtime_stats_interval AS rsi ON rsi.runtime_stats_interval_id=waits.runtime_stats_interval_id
WHERE wait_category_desc='Buffer IO'AND rsi.start_time>=DATEADD(HOUR, -24, GETUTCDATE())
GROUPBY q.query_hash), Ordered AS (SELECT query_hash, total_executions, total_wait_time_ms, sampled_query_text, wait_category_desc, ROW_NUMBER() OVER (ORDERBY total_wait_time_ms DESC, query_hash ASC) AS RN
FROM Aggregated)
SELECT OD.query_hash, OD.total_executions, OD.total_wait_time_ms, OD.sampled_query_text, OD.wait_category_desc, OD.RN
FROM Ordered AS OD
WHERE OD.RN<=15ORDERBY total_wait_time_ms DESC;
GO
写入日志最多查询
-- Top transaction log consumers-- Adjust the time window by changing-- rsi.start_time >= DATEADD(hour, -24, GETUTCDATE())WITH AggregatedLogUsed
AS (SELECT q.query_hash,
SUM(count_executions * avg_cpu_time /1000.0) AS total_cpu_millisec,
SUM(count_executions * avg_cpu_time /1000.0) /SUM(count_executions) AS avg_cpu_millisec,
SUM(count_executions * avg_log_bytes_used) AS total_log_bytes_used,
MAX(rs.max_cpu_time /1000.00) AS max_cpu_millisec,
MAX(max_logical_io_reads) max_logical_reads,
COUNT(DISTINCT p.plan_id) AS number_of_distinct_plans,
COUNT(DISTINCT p.query_id) AS number_of_distinct_query_ids,
SUM( CASEWHEN rs.execution_type_desc ='Aborted'THEN
count_executions
ELSE0END
) AS Aborted_Execution_Count,
SUM( CASEWHEN rs.execution_type_desc ='Regular'THEN
count_executions
ELSE0END
) AS Regular_Execution_Count,
SUM( CASEWHEN rs.execution_type_desc ='Exception'THEN
count_executions
ELSE0END
) AS Exception_Execution_Count,
SUM(count_executions) AS total_executions,
MIN(qt.query_sql_text) AS sampled_query_text
FROM sys.query_store_query_text AS qt
JOIN sys.query_store_query AS q
ON qt.query_text_id = q.query_text_id
JOIN sys.query_store_plan AS p
ON q.query_id = p.query_id
JOIN sys.query_store_runtime_stats AS rs
ON rs.plan_id = p.plan_id
JOIN sys.query_store_runtime_stats_interval AS rsi
ON rsi.runtime_stats_interval_id = rs.runtime_stats_interval_id
WHERE rs.execution_type_desc IN ( 'Regular', 'Aborted', 'Exception' )
AND rsi.start_time >= DATEADD(HOUR, -24, GETUTCDATE())
GROUPBY q.query_hash),
OrderedLogUsed
AS (SELECT query_hash,
total_log_bytes_used,
number_of_distinct_plans,
number_of_distinct_query_ids,
total_executions,
Aborted_Execution_Count,
Regular_Execution_Count,
Exception_Execution_Count,
sampled_query_text,
ROW_NUMBER() OVER (ORDERBY total_log_bytes_used DESC, query_hash ASC) AS RN
FROM AggregatedLogUsed)
SELECT OD.total_log_bytes_used,
(OD.total_log_bytes_used / OD.total_executions) avg_log_bytes_used,
OD.number_of_distinct_plans,
OD.number_of_distinct_query_ids,
OD.total_executions,
OD.Aborted_Execution_Count,
OD.Regular_Execution_Count,
OD.Exception_Execution_Count,
OD.sampled_query_text,
OD.RN
FROM OrderedLogUsed AS OD
WHERE OD.RN <=15ORDERBY total_log_bytes_used DESC;
GO
连接数查询
SELECT
c.session_id, c.net_transport, c.encrypt_option,
c.auth_scheme, s.host_name, s.program_name,
s.client_interface_name, s.login_name, s.nt_domain,
s.nt_user_name, s.original_login_name, c.connect_time,
s.login_time
FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s
ON c.session_id = s.session_id
WHERE c.session_id = @@SPID;
服务器使用情况
SELECTAVG(avg_cpu_percent) AS'Average CPU use in percent',
MAX(avg_cpu_percent) AS'Maximum CPU use in percent',
AVG(avg_data_io_percent) AS'Average data IO in percent',
MAX(avg_data_io_percent) AS'Maximum data IO in percent',
AVG(avg_log_write_percent) AS'Average log write use in percent',
MAX(avg_log_write_percent) AS'Maximum log write use in percent',
AVG(avg_memory_usage_percent) AS'Average memory use in percent',
MAX(avg_memory_usage_percent) AS'Maximum memory use in percent'FROM sys.dm_db_resource_stats;
前X个消耗最多平均CPU时间查询
SELECT TOP 10 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-1THEN 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
GROUPBY query_stats.query_hash
ORDERBY2DESC;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗