Sql-Server-2008

工作區記憶體內部結構

  • January 9, 2021

根據我閱讀的有關 SQL Server 2008 Internals and Troubleshooting 的書籍(從伊利諾伊州當地圖書館借來的),作者 Christian Bolton、Brent Ozar 等。我試圖在 SQL Server 上尋求理解和確認,並在網路上進行大量搜尋,如果有人我將不勝感激可以確認或更正我的理解。

每個需要查詢記憶體授權的查詢或操作都需要工作空間記憶體。在使用排序、雜湊匹配連接、並行(不確定)、批量插入(不確定)、索引重建等的一般查詢中,將需要查詢工作區記憶體。

工作區記憶體是 SQL Server 緩衝池的一部分(它作為緩衝池的一部分分配),最大工作區記憶體是分配給緩衝池的記憶體的 75%。預設情況下,單個查詢不能獲得超過 25% 的工作區記憶體(在 SQL 2008/SQL 2012 中 - 由開箱即用的資源調控器預設工作負載組控制)。

尋求確認我的理解

1)考慮具有 48 GB RAM 和最大伺服器記憶體配置為 40 GB 的系統,這是否意味著最大工作空間記憶體限制為 30 GB,並且單個查詢無法獲得超過 10 GB 的工作空間記憶體(查詢記憶體)。因此,如果您有一個錯誤的查詢處理 10 億行正在執行大規模雜湊聯接並且需要超過 10 GB 的記憶體(工作空間記憶體),它甚至會關心通過這個記憶體授予隊列還是立即溢出到磁碟?

  1. 如果執行大規模排序操作的查詢已分配 5 MB 的工作空間記憶體,並且在查詢執行期間,如果查詢優化器意識到由於統計資訊錯誤或缺少索引,該查詢實際上需要30 MB的工作空間記憶體將立即溢出到 tempdb。即使系統在執行期間有足夠的工作空間記憶體可用,一旦查詢在執行期間超過了授予的工作空間記憶體,它也必須溢出到磁碟。我的理解正確嗎?

它甚至會關心通過這個記憶體授予隊列還是立即溢出到磁碟?

它不是那樣工作的。一旦選擇了需要記憶體授權的計劃,查詢必須獲得授權才能通過隊列。溢出,如果有的話,發生在執行週期的很晚。查詢不能決定在沒有授權的情況下繼續進行,而是“溢出”。它必須獲得授權,並在此基礎上開始執行。如果授權不足(由於估計錯誤或由於獲得的授權比請求的低得多),則查詢將被迫溢出。

如果查詢優化器意識到由於錯誤的統計資訊或缺少索引

嚴格來說,它不是優化器,而是查詢執行。查詢優化器在決定計劃方面只有發言權,但是一旦選擇了計劃並啟動執行,優化器就無法進行。此外,“缺失索引”在這裡沒有任何作用。缺少索引可能會強制執行錯誤的計劃,但它不會影響該“錯誤”計劃的執行方式,因為該計劃的建構考慮了實際存在的索引,因此它確切地知道它可以做什麼和不能做什麼。溢出幾乎總是由於錯誤的估計而發生,即。優化器和執行中糟糕的統計數據或糟糕的基數估計算法(如果你深入研究細節,它會變得非常複雜,所以我會在這裡停下來)。

即使系統在執行期間有大量可用的工作空間記憶體,一旦查詢在執行期間超過了授予的工作空間記憶體,它也必須溢出到磁碟

不幸的是,是的。但是,優化器應該提出一個利用可用 RAM 的計劃。

我推薦閱讀Understanding SQL server memory grant,這是關於該主題的最佳資訊

引用自:https://dba.stackexchange.com/questions/28930