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

来源:https://www.cnblogs.com/MrHSR/archive/2018/07/12/9285983.html
-Advertisement-
Play Games

一.概述 CXPACKET是指:線程正在等待彼此完成並行處理。什麼意思呢? 當sql server發現一條指令複雜時,會決定用多個線程並行來執行,由於某些並行線程已完成工作,在等待其它並行線程來同步,這種等待就叫CXPACKET。 為什麼會有並行線程呢? 因為在sql server 里有個任務調度S ...


一.概述

   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,減少並行度。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 占座 ...
  • 概念 庫級操作 #集合操作 文檔操作 插入 查詢 更新 刪除 mongodb配置 mongodb許可權 ...
  • 一.概述 在mysql 里不同存儲引擎有不同的鎖,預設情況下,表鎖和行鎖都是自動獲得的,不需要額外的命令, 有的情況下,用戶需要明確地進行鎖表或者進行事務的控制,以便確保整個事務的完整性。這樣就需要使用事務控制和鎖定語句來完成。 特點 myisam innodb memory merge ndb 事 ...
  • Lease(租約): 其實就是一個定時器。首先申請一個TTL=N的lease(定時器),然後創建key的時候傳入該lease,那麼就實現了一個定時的key。 在程式中可以定時為該lease續約,也就是不斷重覆的重置TTL=N。當lease過期的時候,其所關聯的所有key都會自動刪除。 Raft協議: ...
  • 原子性 原子性是資料庫的事務中的特性。在資料庫事務的情景下,原子性指的是:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。 對於Redis而言,命令的原子性指的是:一個操作的不可以再分,操作要麼執行,要麼不執行。 Redis操作原子性的原因 Re ...
  • 資料庫索引的特點: 避免進行資料庫全表的掃描,大多數情況,只需要掃描較少的索引頁和數據頁,而不是查詢所有數據頁。而且對於非聚集索引,有時不需要訪問數據頁即可得到數據。 聚集索引可以避免數據插入操作,集中於表的最後一個數據頁面。 在某些情況下,索引可以避免排序操作。 資料庫索引與數據結構 上文說過,二 ...
  • 1.查看是否已經安裝了mysql 系統預設裝了一個mysql-libs,我們卸載掉 2.去下載mysql所必須的rpm包 註:紅框里的這個mysql-community-devel 就不裝了,貌似用處暫時用不到 3.進行rpm軟體包安裝 4.初始化資料庫,開啟資料庫 5.設置資料庫密碼 預設的是有密 ...
  • 進入reids ##redis五種數據類型、及操作 string set key value 設置給定 key 的值。如果 key 已經存儲其他值, SET 就覆寫舊值,且無視類型。 set name 'bear' get key 返回key的值,若key不存在則返回nil ​ mset key v ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...