Sql-Server

SQL Server 如何確定分配給數據記憶體的記憶體量

  • January 14, 2019

SQL Server Standard Edition對可用於數據記憶體的記憶體量有限制。考慮到這一點,企業版如何決定它可以為數據記憶體使用多少記憶體?假設我們有 400GB 的記憶體——其中大部分將分配給數據記憶體、計劃記憶體和工作記憶體。

SQL Server 如何決定這 400GB 中有多少流向各個區域?

考慮到這一點,企業版如何決定它可以為數據記憶體使用多少記憶體?

SQL Server 記憶體(緩衝池)旨在根據系統上的可用記憶體(我的意思是 Windows Server 上的 RAM)調整其需求。確切的算法沒有人知道,但我可以告訴你的是,當 SQL Server 啟動時,它開始分配記憶體,記住三個標誌,這些是資源監視器標誌。

  1. MEMPHYSICAL_HIGH
  2. MEMPHYSICAL_LOW
  3. RESOURCE_MEM_STEADY

實際上下面有很多東西,但我試圖為你簡化一些事情。只要在視窗中發出 MEMPHYSICAL_HIGH 通知,SQL Server 就會根據其需要繼續分配記憶體,或者直到它認為它不再需要記憶體並且它需要的大多數頁面都記憶體在記憶體中。如果記憶體不足,則標記 MEMPHYSICAL_LOW 並且 SQL Server 將嘗試修剪其各種記憶體。當達到穩定狀態時,標誌 RESOURCE_MEM_STEADY 被標記,這意味著 SQl 伺服器的記憶體介於高和低標誌之間。我會引用Karthick PK 的部落格

發出 LowMemoryResourceNotification 事件信號的預設可用記憶體級別約為每 4 GB 32 MB,最大為 64 MB。(預設情況下,大多數係統上的門檻值為 64mb)。

表示高記憶體資源通知事件的預設級別是預設低記憶體值的三倍(預設情況下,在大多數係統上,門檻值是 64*3=192 MB)。

關鍵點:

  1. 一旦系統上的可用記憶體低於 192 MB HighMemoryResourceNotification (MEMPHYSICAL_HIGH) 信號就會被 Windows 撤銷,並且 SQL Server 將不會增長其 Bpool。
  2. 一旦系統上的可用記憶體低於 64 MB LowMemoryResourceNotification (MEMPHYSICAL_low) 由 Windows 發出信號,SQL Server 將收縮其 Bpool(減少其記憶體使用量)。
  3. 當系統中的可用記憶體在 192Mb 和 64Mb 之間(即在 LowMemoryThreshold 和 HighMemoryThreshold 之間)時,SQL Server 不會增加或減少其使用量(有一些例外情況,我們稍後會看到)

您當然可以選擇從系統資料庫中更改門檻值。

SQL Server 如何決定這 400GB 中有多少流向各個區域?

同樣它是動態的,取決於要求。因此,您有 400 GB 記憶體並假設您已將最大伺服器記憶體設置為 350 GB。SQL Server 在啟動時不會嘗試獲取所有 350 GB。這取決於工作量。如果在啟動後您正在執行繁重的工作負載,則最多需要 350 GB,如果它進一步需要記憶體,它將通過將臟頁刷新到磁碟並拉取更多頁來幫助LazywriterCheckpoint處理在緩衝池中創建一些空間。這裡的寓意是沒有固定的規則,很多事情取決於工作量和 SQL Server 配置。

上述情況也適用於佔用緩衝池塊的數據記憶體。

隱藏計劃:

計劃記憶體有點有趣。讓我們在 SQL Server 2005 Sp2 之後再談 SQL Server中計劃記憶體沒有上限的情況。當查詢開始訪問 SQL 伺服器時,計劃記憶體通常會嘗試增長,但它不能無限增長。有一個公式可以跟踪在從其中刪除舊/陳舊計劃以為新計劃創造空間之前可以增長的最大計劃記憶體。見下圖取自Kalen Delaneys 的部落格

Cache pressure limit 將刪除計劃記憶體中的舊條目限制後的定義。要計算Target memory將用於計算壓力限制的內容,請參閱Kalen的此問答部落格

在此處輸入圖像描述

我沒有更新版本的公式。隨著 SQL Server 2016 中查詢儲存的到來,情況發生了變化,但我不確定這個公式是否發生了變化。無論如何,我認為討論這個公式沒有意義。

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