Troubleshooting SQL Server RESOURCE_SEMAPHORE Waittype Memory Issues

来源:http://www.cnblogs.com/kerrycode/archive/2017/06/23/7068246.html
-Advertisement-
Play Games

前言: 本文是對博客https://www.mssqltips.com/sqlservertip/2827/troubleshooting-sql-server-resourcesemaphore-waittype-memory-issues/的翻譯,本文基本直譯,部分地方讀起來有點不自然。 如有翻... ...


 

 前言: 本文是對博客https://www.mssqltips.com/sqlservertip/2827/troubleshooting-sql-server-resourcesemaphore-waittype-memory-issues/的翻譯,本文基本直譯,部分地方讀起來有點不自然。 如有翻譯不對或不好的地方,敬請指出,大家一起學習進步。尊重原創和翻譯勞動成果,轉載時請註明出處http://www.cnblogs.com/kerrycode/p/7068246.html。謝謝!

 

 

問題描述

 

今天,我們的一個SQL Server實例性能變得非常慢。當我登錄到資料庫伺服器進行一些初始檢查時,我最初始觀察、註意到的是它的記憶體壓力(memory pressure)。接下來,我們必須找出是什麼導致我們的實例出現記憶體緊張。當我檢查事務的等待類型時,RESOURCE_SEMAPHORE等待是大多數事務的問題。在這篇文章中,我將描述這個問題,以及如何查找哪個查詢語句或事務導致了記憶體壓力

 

解決方案

 

當我檢查所有事務的等待類型時,大多數事務的等待類型為RESOURCE_SEMAPHORE 等待以及某些頁面IO等待。頁面IO等待也是由於記憶體壓力導致,因為這些事務無法獲得足夠的記憶體來執行這個操作。

資源信號量等待

 

在繼續之前,我想對資源信號量Resource_semaphore等待進行一些說明,以便您可以更好地瞭解SQL Server是如何將記憶體授予SQL Server查詢語句的。

SQL Server收到用戶發送的查詢請求(查詢語句)時,它首先創建一個編譯過的計劃,然後在這個基礎上創建一個執行步驟(個人覺得執行步驟比執行計劃要合適)。當SQL Server創建一個編譯過的計劃時,它會計算兩個記憶體授予參數,稱為請求記憶體required memory)和附加記憶體(additional memory)。請求記憶體是運行排序和HASH連接所需的最小記憶體。它之所以是 "必需", 是因為如果沒有可用的請求記憶體, 查詢將無法啟動。附加記憶體(additional memory)是在記憶體中存儲臨時行(個人覺得翻譯為中間結果可能更合理)所需的記憶體量。這被稱為額外(附加)的,因為如果沒有足夠可用的附加記憶體可以將查詢的中間結果存儲在磁碟上。 

首先,伺服器計算任何給定的查詢執行需要多少記憶體。這通常是請求記憶體required memory)和附加記憶體(additional memory)的總和,但如果您的實例正在並行處理,那麼所需的記憶體將是(所需的記憶體* DOP+附加記憶體。伺服器檢查所需的記憶體是否超過每個查詢限制,然後伺服器減少附加記憶體,直到總數達到限制。這個修改後的大小稱為請求記憶體。SQL Server有一個內部工具稱為資源信號量(RESOURCE SEMAPHORE),用於將此請求的記憶體授予查詢。如果無法通過資源信號量向該請求的記憶體授予查詢,那麼如果查詢sys.sysprocesses系統表或​​sys.dm_exec_request DMV,則該查詢將處於等待狀態,並出現RESOURCE_SEMAPHORE等待類型。

當資源信號量Resource_semaphore接收到新的請求時,它首先檢查是否有任何查詢正在等待中。只要發現存在即是一個等待查詢,那麼會將新查詢(新請求)放入隊列中,因為等待隊列是以先到先得的方式設計的,並且有小權重以支持於小型查詢。當沒有等待查詢或查詢返回保留的記憶體時。資源信號量嘗試授予記憶體。如果找到足夠的記憶體,那麼請求記憶體被授予並且查詢可以開始運行,並且如果沒有找到足夠的可用記憶體來授予所請求的記憶體,那麼它將當前查詢放入等待隊列中,並且給當前會話RESOURCE_SEMAPHORE等待類型, 此時伺服器開始面臨記憶體壓力。

 

 

識別RESOURCE_SEMAPHORE等待

 

步驟1

 

 

首先,我們需要研究我們的實例,弄清楚為什麼在SQL Server中出現記憶體壓力。要查看所有事務的大概信息,我們可以查詢sys.sysprocesses,或者我們可以使用sys.dm_exec_requests DMV

SELECT * FROM sys.sysprocesses

ORDER BY lastwaittype

 

 

這裡我們可以看到所有產生RESOURCE_SEMAPHORE等待類型的進程。

clip_image001

 

步驟2

 

從上面的SQL查詢,我們可以看到大量的事務正處於Resource Semaphore(資源信號量)等待狀態。現在我們可以運行下麵的SQL語句來查看已分配到記憶體的查詢的目前狀態,和未被分配記憶體的查詢的數量。                

                                                       

DMV的輸出返回兩行,一個表示大型查詢(resource_semaphore_id0),另一個表示小型查詢(resource_semaphore_id1),小於5 MB。在這裡,您可以獲得實例的總授予記憶體和總可用記憶體。請參閱grantee_countwaiter_count上的數字,grantee_count是已經分配了記憶體的總查詢數,waiter_count是隊列中等待獲取記憶體的總查詢數量。所以在這裡我們可以看到大約100個查詢正在等待獲得他們要求的記憶體。

 

SELECT * FROM sys.dm_exec_query_resource_semaphores

 

clip_image002

 

步驟3

 

現在我們將獲取所有正在等待隊列中獲取所請求的記憶體的所有查詢的詳細信息,我們將使用DMV sys.dm_exec_query_memory_grants來獲取隊列中等待分配記憶體的查詢總數。對於等待獲取其請求的記憶體的查詢,grant_timegranted_memory_kb列將為NULL。您可以在下麵的截圖中查看所請求的記憶體量及其等待狀態,因為它們的grant_timegranted_memory_kb值為NULL。我們還可以使用該DMV獲取所有查詢的plan_handlesql_handle。稍後我們將使用這些值來獲取確切的查詢。

註意:有太多列要顯示,可以只顯示部分所需的列。

 

SELECT * FROM sys.dm_exec_query_memory_grants

 

clip_image003

 

 

步驟4

現在,我們將找到記憶體密集型查詢。我們可以看到所有等待查詢的請求記憶體。在這裡我們可以看到所請求的記憶體對於大多數事務來說太大了。我們將獲得所有這些查詢的plan_handle,以獲得確切的SQL文本來查看查詢計劃。

sys.dm_exec_query_memory_grants中選擇前10*

 

select top 10 * from sys.dm_exec_query_memory_grants

clip_image004

 

步驟5

 

現在我們將使用上面查詢所獲得的plan_handlesql句柄來獲取SQL代碼。

運行以下語句從上述查詢中獲取SQL代碼,使用sql_handle

 

SELECT * FR

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

-Advertisement-
Play Games
更多相關文章
  • <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><style type="text/css">body { margin: 0; background: #f1f1f1;}p { ma ...
  • 轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/72876628 本文出自 "【趙彥軍的博客】" Fiddler是什麼? Fiddler是一個http調試代理,它能 夠記錄所有的你電腦和互聯網之間的http通訊,Fiddler 可以也 ...
  • armv7,armv7s,arm64,i386,x86_64 詳解 一、概要 平時項目開發中,可能使用第三方提供的靜態庫.a,如果.a提供方技術不成熟,使用的時候就會出現問題,例如: 在真機上編譯報錯:No architectures to compile for (ONLY_ACTIVE_ARCH ...
  • 一,工程圖。 二,代碼。 ...
  • 本人曾去某金融軟體公司面試,交流中面試官問的一個問題是:“如果有 A、B 兩張表,A 表中有 2 條數據,B 表中有 200 條數據,請問 SELECT FROM A,B 能查出多少條數據?”。 聽到這個問題的瞬間我就懵了,因為我自己也做過近兩年的面試官,所以我首先會想的就是他問這麼沒有實際意義(實 ...
  • 1、下載及安裝 請到官網下載:www.treesoft.cn,要最新的版本treeNMS, window系統下載直接解壓,就可以用了,免安裝,免佈署。 2、登錄及連接參數配置 登錄後,要配置連接參數信息,並測試連接是否成功!連接成功保存,刷新頁面一下。 3、狀態監控 treeNMS有狀態實時監控,及 ...
  • 這是我的SQL Server 2012 酸爽的安裝體驗,包括完全卸載SQL Server以及安裝過程中出現的錯誤的解決方案,分享出來,希望大家能少走彎路。 ...
  • [20170623]利用傳輸表空間恢復部分數據.txt--//昨天我測試使用傳輸表空間+dblink,上午補充測試發現表空間設置只讀才能執行impdp導入原數據,這個也很好理解.--//這樣的操作模式僅僅減少expdp生成原數據的過程.--//我想一下,rman也支持建立傳輸表空間的命令.我仔細看了 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...