SQL Server等待事件—RESOURCE_SEMAPHORE_QUERY_COMPILE

来源:https://www.cnblogs.com/kerrycode/archive/2018/03/14/8564130.html
-Advertisement-
Play Games

等待事件介紹 關於等待事件RESOURCE_SEMAPHORE_QUERY_COMPILE,官方的介紹如下: Occurs when the number of concurrent query compilations reaches a throttling limit. High waits ... ...


等待事件介紹

 

關於等待事件RESOURCE_SEMAPHORE_QUERY_COMPILE,官方的介紹如下:

 

       Occurs when the number of concurrent query compilations reaches a throttling limit. High waits and wait times may indicate excessive compilations, recompiles, or uncachable plans.

 

該等待事件在併發查詢編譯的數量達到閥值限制時出現。 等待時間較長或等待次數較多可能表明編譯、重新編譯或不能緩存的計划過多

 

 

等待事件分析

 

記憶體授予的等待類型叫做RESOURCE_SEMAPHORE.在理解這個等待事件前,我們先來瞭解一下查詢記憶體授予(query memory grant),它是用於在排序或連接時存儲臨時數據的伺服器記憶體的一部分。查詢在實際執行前需要先請求保留記憶體,所以會存在一個授予的動作。這樣的好處是提高查詢的可靠性和避免單個查詢占用所有的記憶體。

 

SQL Server在收到查詢時,會執行3個被定義好的步驟來返回用戶所請求的結果集。

  

 

  1. 生成編譯計劃(compiled plan)。它包括各種邏輯指令,如怎麼聯接數據行。

   2. 生成執行計劃(execution plan),它包含將編譯計劃中的各種邏輯引用轉換成實際的對象的指令和查詢執行的跟蹤機制。

   3. 從指令樹的頂端開始執行。

 

生成編譯計劃是件開銷較大的事情,因為它需要在數以百計的編譯計劃中找出較優的一個。它的時間通常很短,因為優化器會在找到最優的編譯計劃後便馬上釋放記憶體。編譯主要使用記憶體和CPU資源。缺少可用記憶體可能會導致編譯延遲和得到非最優的編譯計劃。    

 

 

當SQL Server創建編譯計劃時,會計算兩個參數:必須記憶體(Requeried memory)和額外記憶體(Additional memory)。

  

  必須記憶體:執行排序和哈希聯接所需的最少記憶體。這部分記憶體是必須的,它用來創建處理排序和哈希所需要的內部數據結構。

  額外記憶體:存儲所有臨時數據行所需的記憶體。它的大小由基數評估(Cardinality estimate,如行數和行大小)決定。額外,顧名思義在缺少這部分記憶體時,將會將臨時數據行存到硬碟上,並不會導致查詢失敗。一個查詢的額外記憶體大小如果超過預設的限制,它實際得到的記憶體量並不一定會跟請求量一樣。

 

例如,對行大小為10byte的100萬行數據進行排序,此查詢的必須記憶體為為512KB(此值是SQL Server處理一個排序操作創建內部數據結構所需的最小記憶體量)。為了存儲所有數據行,額外記憶體可能是10MB。

 

  當編譯計劃中含有多個排序和聯接操作時,額外記憶體的計算就變得複雜了。因為SQL Server要考慮所有操作符如何高效地使用記憶體。可以查看ShowPlan XML中的<MemoryFractions>標記部分內容,獲取更多記憶體使用的信息

 

RESOURCE_SEMAPHORE_QUERY_COMPILE等待事件一般是查詢正在等待授予記憶體以開始進行編譯時發生。編譯記憶體來自緩衝池(buffer pool),並需要保留足夠的時間以完成編譯過程。 對於多個併發編譯而言,占用太多記憶體頁可能會導致記憶體壓力。 為了緩解這種情況,SQL Server啟動編譯過程,確定哪些查詢需要大量的頁面,並迫使某一些查詢會話等待。 同樣,如果記憶體壓力已經存在,SQL Server將限制可以同時編譯的資源密集型查詢的數量。

 

  如果你的資料庫經常看到這種等待事件或此等待類型過多,那麼你的資料庫可能會有太多記憶體密集型查詢(大型查詢),或者其他進程可能正在從緩衝池中竊取記憶體頁面.

 

 

減少等待事件方案

 

 

  1. Decrease query complexity 降低查詢語句的複雜度。

 

  1. Appropriate indexing could reduce plan complexity  合理創建索引減少執行計劃複雜度

 

  1. Improve plan reuse (therefore compilation can be avoided)  改善執行計劃重用(因此可以避免編譯)

 

  1. kill掉一些糟糕的SQL語句(記憶體資源密集型SQL),當然這個要看是否可行。

 

 

 

個人曾遇到過這樣一個案例,由於過度靈活設計,導致很多報表需要在SQL中大量關聯相關表,更糟糕的是,由於開發人員大量使用視圖,尤其是還存在視圖嵌套視圖的情況,所以在這樣一個系統中,一些查詢語句往往需要授予大量的記憶體,尤其是當出現一個或一些寫的很糟糕的SQL語句時,就會經常看到一些會話處於RESOURCE_SEMAPHORE_QUERY_COMPILE的等待狀態,而且當大量會話處於RESOURCE_SEMAPHORE_QUERY_COMPILE等待時,還有一個特殊現象就是活動的會話數量會彪增,此時,可以找到消耗記憶體最多的SQL,然後Kill掉後,活動的會話就會立即降下來。下麵就是我遇到案例的一個截圖。

 

SELECT mg.granted_memory_kb, mg.session_id, t.text, qp.query_plan 
FROM sys.dm_exec_query_memory_grants AS mg
CROSS APPLY sys.dm_exec_sql_text(mg.sql_handle) AS t
CROSS APPLY sys.dm_exec_query_plan(mg.plan_handle) AS qp
ORDER BY 1 DESC OPTION (MAXDOP 1)

clip_image001

 

另外,記憶體緊張也會導致RESOURCE_SEMAPHORE_QUERY_COMPILE的出現的概率增加,那麼是否增加記憶體就有效解決RESOURCE_SEMAPHORE_QUERY_COMPILE等待事件呢?答案是否定的,但是能緩解。如下描述:

 

     This wait occurs when queries cannot be compiled due to the amount of compile memory currently available. This mostly occurs due to large queries requiring an excessive amount of memory. SQL Server caps the amount of complex queries that can be compiled at once, so increasing the memory allocation will not solve the problem effectively (it will only increase the amount of memory that can be allocated, not the number of queries)

 

 

參考資料:

 

https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-os-wait-stats-transact-sql

https://documentation.red-gate.com/sm4/working-with-overviews/using-performance-diagnostics/list-of-common-wait-types/resource_semaphore_query_compile

https://www.sqlskills.com/help/waits/resource_semaphore_query_compile/

https://blogs.msdn.microsoft.com/support_sql_france/2012/02/07/sql-server-compilation-gateways-and-resource_semaphore_query_compile/

https://blogs.msdn.microsoft.com/sqlqueryprocessing/2010/02/16/understanding-sql-server-memory-grant/


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

-Advertisement-
Play Games
更多相關文章
  • 進程管理回顧 基本方法: 用戶進程最大記憶體640K。 問題:記憶體過小,如果應用程式需要更多記憶體怎麼辦 解決方案:overlay。僅載入當前必須的代碼和數據。 問題:P1, P2都在運行,P1需要申請更多記憶體,但記憶體已經用完 解決方案:swap(將P2臨時交換到外存)。缺點:磁碟傳輸導致swap成本極 ...
  • 本文目錄:1.stickiness和stick table簡介2.使用stick table 2.1 創建stick table 2.2 查看stick table 2.3 使用客戶端源IP作為客戶端標識符 2.4 使用cookie作為客戶端標識符 2.5 使用String作為客戶端標識符 2.6 ...
  • 轉載自:http://blog.csdn.net/j755ing/article/details/69400439 第一步: 下載 材料/工具: 下載 VMware Workstation 12 Pro , 下載 Mac OS安裝補丁(unlocker208), 下載 OS X 10.11.1(15 ...
  • 資源競爭 相互隔絕:兩個進程不會同時進入critical section progress: critical section之外的進程不會阻止其他進程進入他們的critical section bounded waiting: 每個進程等待有限時間即可進入critical section spee ...
  • 轉自:https://www.cnblogs.com/waynechou/p/xtrabackup_backup.html 閱讀目錄 xtrabackup 選項 xtrabackup 全量備份恢復 xtrabackup 增量備份恢復 轉自:https://www.cnblogs.com/waynec ...
  • 更新源列表 打開"終端視窗",輸入"sudo apt-get update" 安裝ssh 打開"終端視窗",輸入"sudo apt-get install openssh-server"-->回車-->輸入"y"-->回車-->安裝完成。 查看ssh服務是否啟動 打開"終端視窗",輸入"sudo p ...
  • Linux 的發行版實在是太多了。初次接觸 Linux 的同學,面對這麼的發行版,估計會有點暈。所以,在寫完《新手如何搞定 Linux 操作系統》一文之後,俺接著來掃盲一下 Linux 的發行版。 ★"內核"與"發行版"的關係 對於新手而言,需要先搞清楚這兩個概念(已經明白的同學,請跳過本節)。 ◇ ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RT系列MCU的基本特性。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...