SQL SERVER性能調優之五(CPU性能分析)
(一)概述
(1)CPU對一台數據庫服務器來說,是非常重要的資源。廢話少說大家都懂的。
(2)如何監控CPU性能。
2.1 可以使用system perfmon收集Processor:% Processor Time性能計數器,可以參見另一篇文章
2.2使用SQL Server Performance Dashboard。
(二)什么原因會導致CPU性能問題?
(1)大量消耗CPU的運算,如哈希運算,排序運算。
(2)執行計划的編譯和重編譯。
(3)缺乏索引的大量IO操作也會引起額外的CPU消耗。
(4)並行操作。
等等。。。。
(三)具體手段
(1)幾個重要的等待,先確定服務器級別的等待。
SELECT wait_type, Sum(signal_wait_time_ms) AS TotalSignalWaitTime FROM sys.dm_os_wait_stats GROUP BY wait_type ORDER BY 2 DESC
CXPACKET等待:等待多個線程同步,會出現此等待。
SOS_SCHEDULER_YIELD:放棄CPU,並等待繼續執行。
如果發現大量CXPACKET等待,可能由於並行造成,在OLTP系統,可以考慮降低並行度。
如果發現大量SOS_SCHEDULER_YIELD等待,可能說明你的CPU存在瓶頸。
(2)幾個重要的計數器
sql statistics: sql compilations/sec 每秒的查詢編譯次數
sql statistics: sql recompilations/sec 每秒的查詢重編譯次數
如果發現以上兩個性能計數器的值非常高,可以CPU性能問題有編譯造成。可以采用存儲過程封裝T-SQL語句,參數化查詢,緊急時可以開啟數據強制參數化。
(3)語句級別處理
SELECT TOP 10 total_worker_time / execution_count AS [Avg CPU Time], (SELECT Substring(text, statement_start_offset / 2, ( 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 Time] DESC
select top 10 (total_logical_reads/execution_count) as avg_logical_reads, (total_logical_writes/execution_count) as avg_logical_writes, (total_physical_reads/execution_count) as avg_phys_reads, Execution_count, statement_start_offset as stmt_start_offset, sql_handle, plan_handle from sys.dm_exec_query_stats order by (total_logical_reads + total_logical_writes) Desc
使用該查詢可以查詢CPU和IO消耗最高的10個語句,可以逐一分析,是否可以更改寫法或者適當添加索引,降低CPU使用率(一般高CPU和高IO關聯,所以可以想辦法先降低IO,直觀的處理,就是減少語句的邏輯讀)。
(四)總結
CPU優化是一個長期的過程,需要定義將當前的性能計數器和基線對比,盡早的發現問題,CPU出現性能問題,有時候也不一定代表就是CPU出現瓶頸了,可能預示其他硬件出現故障了,或者索引被意外刪除了,網站受到攻擊等等,所以CPU監控至關重要。