sql server 性能調優之 資源等待 CXPACKET


一.概述

   CXPACKET是指:線程正在等待彼此完成並行處理。什么意思呢? 當sql server發現一條指令復雜時,會決定用多個線程並行來執行,由於某些並行線程已完成工作,在等待其它並行線程來同步,這種等待就叫CXPACKET。

  為什么會有並行線程呢?  因為在sql server 里有個任務調度SCHEDULER是跟操作系統CPU個數 默認是一 一匹配的,  我們也可能通過sp_configure來設置最大並行度,也就是Max Degree of Parallelism (MAXDOP)。 關於調度可參考 " sql server 任務調度與CPU"

  並行處理的優勢: 用多個線程來執行一個指令,當sql server發現一條指令復雜時或語句中含有大數據量要處理,此時執行計划會決定用多個線程並行來執行,從而提高整體響應時間,例如一個指令讀入100w條記錄, 如果用一個線程做 可能需要10秒, 如果10個線程來做 可能只需要1秒,加上線程間同步時間也不過2秒。

  並行處理的劣勢:1是並行線程要等待同步。2是由於這10個線程全力以赴,就有10個對應的cpu,這樣別的用戶發過來的指令就會受到影響,甚至拿不到cpu來執行。所以對於並發度要求高的需要及時響應的,一般會建議手動設置每個指令的並行線程數。反之可以不設置Max Degree of Parallelism由系統默認去並行或者設少一點並行度。

   1.1   查詢 CXPACKET的等待

  借助上一次性能調優的資源等待統計圖,會發現等待時間最長的就是CXPACKET類型。

  

 1.2  模擬CXPACKET的並行處理 

     下面是一個分組查詢,在執行計划中看到,以采用了並行處理

 

  下面是通過sys.dm_os_waiting_tasks 來查看該語句的task任務。

 或采用sys.sysprocesses查看結果。下面一個舉例中 會話session是SPID 56。 這里我們明顯看到,SQL Server使用了5個線程kpid 來執行這個query。

    

 1.3  分析CXPACKET的並行處理

  由於並行的原因而從出現了Expacket 的等待。是否並行的執行,通過執行計划可以查看到,下面是查詢大表中的數據,sql server自動加啟了並行執行。

   

  

  共調用了32個線程來並行查詢

  

1.4  控制CXPACKET並行度

   有時后台執行的sql, 對於並發度要求不高,  不需要及時響應的,一般會建議手動設置每個指令的並行線程數。

  

    設置可以發現並行度就二個線程。

    

1.5  CXPACKET資源等待總結

 (1) 通過實例級別查出CXPACKET的等待時間包括總等時間,平均等待時間,最大等待時間。

 (2) 查看並行的前十條語句 (這種查詢不建議使用,因為條件是查找含有並行parallel的執行計划,查詢響應很慢)。

SELECT TOP 10
        p.* ,
        q.* ,
        qs.* ,
        cp.plan_handle
FROM    sys.dm_exec_cached_plans cp
        CROSS APPLY sys.Dm_exec_query_plan(cp.plan_handle) p
        CROSS APPLY sys.Dm_exec_sql_text(cp.plan_handle) AS q
        JOIN sys.dm_exec_query_stats qs ON qs.plan_handle = cp.plan_handle
WHERE   cp.cacheobjtype = 'Compiled Plan'
        AND p.query_plan.value('declare namespace p="http://schemas.microsoft.com/SQL Server/2004/07/showplan";
max(//p:RelOp/@Parallel)', 'float') > 0
OPTION  ( MAXDOP 1 )

 (3) 找出cpu和i/o耗性能最高的sql語句, 查看執行計划是否有並行處理。

 (4)  找出程序中感覺復雜的sql語句,查看執行計划。

 (5)  避免或減少白天執行頻繁復雜sql,優化sql 建好索引。

 (6)  當執行計划發現並不需要用並行執行時,強制sql 使用OPTION ( MAXDOP x) 也不會采用並行執行。

最后考慮調整並行度的開銷閾值或降低並行度。

  設置sql語句級的MAXDOP。如果MAXDOP=1的話,使得一個BATCH只對應一個TASK。如果沒有設置MAXDOP,一個BATCH可能會產生多個TASKS,那么TASK之間的協調,等待等等,將是很大的開銷。把MAXDOP設小,能同時減少WORKER的使用量。所以,如果我們看到等待類型為CXPACKET的話,那么我們可以設置MAXDOP,減少並行度。


免責聲明!

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



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