SQL Server中查詢CPU占用高的SQL語句


本文導讀:觸發器造成死鎖、作業多且頻繁、中間表的大量使用、游標的大量使用、索引的設計不合理、事務操作頻繁、SQL語句設計不合理,都會造成查詢效率低下、影響服務器性能的發揮。我們可以使用sql server自帶的性能分析追蹤工具sql profiler分析數據庫設計所產生問題的來源,進行有針對性的處理;下面介紹SQL Server中如何查詢CPU占用高的SQL語句

SQL Server中查詢CPU占用高的情況,會用到sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests

 

一、查看當前的數據庫用戶連接有多少

USE master GO SELECT * FROM sys.[sysprocesses] WHERE [spid]>50 --AND DB_NAME([dbid])='gposdb' SELECT COUNT(*) FROM [sys].[dm_exec_sessions] WHERE [session_id]>50

 

二、選取前10個最耗CPU時間的會話

SELECT TOP 10 [session_id], [request_id], [start_time] AS '開始時間', [status] AS '狀態', [command] AS '命令', dest.[text] AS 'sql語句', DB_NAME([database_id]) AS '數據庫名', [blocking_session_id] AS '正在阻塞其他會話的會話ID', [wait_type] AS '等待資源類型', [wait_time] AS '等待時間', [wait_resource] AS '等待的資源', [reads] AS '物理讀次數', [writes] AS '寫次數', [logical_reads] AS '邏輯讀次數', [row_count] AS '返回結果行數' FROM sys.[dm_exec_requests] AS der CROSS APPLY sys.[dm_exec_sql_text](der.[sql_handle]) AS dest WHERE [session_id]>50 AND DB_NAME(der.[database_id])='gposdb' ORDER BY [cpu_time] DESC 

 

三、查詢前10個最耗CPU時間的SQL語句

SELECT TOP 10 dest.[text] AS 'sql語句' FROM sys.[dm_exec_requests] AS der CROSS APPLY sys.[dm_exec_sql_text](der.[sql_handle]) AS dest WHERE [session_id]>50 ORDER BY [cpu_time] DESC 

 

四、查詢會話中有多少個worker在等待 

SELECT TOP 10 [session_id], [request_id], [start_time] AS '開始時間', [status] AS '狀態', [command] AS '命令', dest.[text] AS 'sql語句', DB_NAME([database_id]) AS '數據庫名', [blocking_session_id] AS '正在阻塞其他會話的會話ID', der.[wait_type] AS '等待資源類型', [wait_time] AS '等待時間', [wait_resource] AS '等待的資源', [dows].[waiting_tasks_count] AS '當前正在進行等待的任務數', [reads] AS '物理讀次數', [writes] AS '寫次數', [logical_reads] AS '邏輯讀次數', [row_count] AS '返回結果行數' FROM sys.[dm_exec_requests] AS der INNER JOIN [sys].[dm_os_wait_stats] AS dows ON der.[wait_type]=[dows].[wait_type] CROSS APPLY sys.[dm_exec_sql_text](der.[sql_handle]) AS dest WHERE [session_id]>50 ORDER BY [cpu_time] DESC

 

五、查詢CPU占用高的語句

SELECT TOP 10 total_worker_time/execution_count AS avg_cpu_cost, plan_handle, execution_count, (SELECT SUBSTRING(text, statement_start_offset/2 + 1, (CASE WHEN statement_end_offset = -1 THEN LEN(CONVERT(nvarchar(max), text)) * 2 ELSE statement_end_offset END - statement_start_offset)/2) FROM sys.dm_exec_sql_text(sql_handle)) AS query_text FROM sys.dm_exec_query_stats ORDER BY [avg_cpu_cost] DESC


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM