SQL Server CPU使用率の高いクエリを確認する

SQL Server CPU使用率の高いクエリを確認する

SQL ServerでCPU使用率の高いクエリを確認する手順を記述してます。

環境

  • OS windows10 pro
  • SQL Server2019 Express
  • SSMS 18.7.1

クエリを確認

SSMSを使用して、対象のオブジェクト名を右クリックします。

「レポート(P)」>「標準レポート」から「CPUの平均時間ごとの上位のクエリ」を選択します。

キャッシュに残っているクエリの中から、上位の10位までのクエリが表示されます。

PDFにエクスポートすることも可能です。

クエリを使用すると、上位10位以外も取得することが可能です。

SELECT TOP 100
        rank() over(order by total_worker_time desc,sql_handle,statement_start_offset) AS [row_no]
,       db_name(st.dbid) AS [database_name]
,       creation_time
,       last_execution_time
,       (total_worker_time+0.0)/1000 AS [total_worker_time(ms)]
,       (total_worker_time+0.0)/(execution_count*1000) AS [AvgCPUTime(ms)]
,       (total_elapsed_time+0.0)/1000 AS [total_elapsed_time(ms)]
,       (total_elapsed_time+0.0)/(execution_count*1000) AS [AvgElapsedTime(ms)]
,       total_logical_reads AS [LogicalReads(page)]
,       total_logical_writes AS [logicalWrites(page)]
,       total_logical_reads+total_logical_writes AS [AggIO(page)]
,       (total_logical_reads+total_logical_writes)/(execution_count + 0.0) AS [AvgIO(page)]
,       execution_count
,       total_rows
,       st.text AS [batch_query_text]
,   CASE 
        WHEN sql_handle IS NULL
        THEN ' '
        ELSE ( SUBSTRING(st.text,(qs.statement_start_offset+2)/2,
		(CASE 
        WHEN qs.statement_end_offset = -1        
        THEN LEN(CONVERT(NVARCHAR(MAX),st.text))*2      
        ELSE qs.statement_end_offset    
        END 
        - qs.statement_start_offset) /2  ) )
    END AS [statement_query_text] 
,       plan_generation_num
,       qp.query_plan
FROM sys.dm_exec_query_stats   AS [qs]
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS [st]
CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS [qp]
WHERE total_worker_time > 0 
ORDER BY  [AvgCPUTime(ms)]  DESC
OPTION (RECOMPILE)