天天看點

如何檢查SQL Server CPU瓶頸

--檢測CPU壓力的一個方法是計算運作狀态下的工作程序數量,

--通過執行如下的DMV查詢可以得到這個資訊

SELECT COUNT(*) AS workers_waiting_for_cpu,t2.scheduler_id

FROM sys.dm_os_workers AS t1, sys.dm_os_schedulers AS t2

WHERE t1.state='RUNNABLE' AND

t1.scheduler_address = t2.scheduler_address AND

t2.scheduler_id<255

GROUP BY t2.scheduler_id

--也可以執行如下的查詢得到工作程序在可運作狀态下花費的時間

SELECT SUM(signal_wait_time_ms) FROM sys.dm_os_wait_stats

--下面是一個DMV查詢,它可以用來找出每次執行中占用CPU最多的錢10為查詢,

--也列出了SQL語句的查詢計劃及計劃被執行的次數。如果一個查詢大家雖高,

--但執行次數少,那也可以采納。

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

--以上DMV隻顯示目前被緩存的查詢合計統計資訊

--為了找出工作負荷中運作最頻繁的查詢,就需要執行下面的DMV查詢。

SELECT TOP 10 total_worker_time ,plan_handle,execution_count,

FROM sys.dm_exec_query_stats ORDER BY execution_count

--SQL Server在優化查詢計劃上花費的時間可以用下面的DMV查詢

SELECT * FROM sys.dm_exec_query_optimizer_info WHERE counter='optimizations'

UNION

SELECT * FROM sys.dm_exec_query_optimizer_info WHERE counter='elapsed time'

SELECT TOP 10 plan_generation_num ,plan_handle,execution_count,

WHERE plan_generation_num>1

ORDER BY execution_count

 --檢查高速緩存記憶體

DBCC memorystatus