適用於:SQL Server
SQL Server 資料庫引擎的記憶體使用率受一對組態設定 min server memory (MB)max server memory (MB)和 的限制。 隨著時間推移,在正常情況下,SQL Server 會嘗試宣告記憶體,達到 所 max server memory (MB)設定的限制。
注意
列存索引:概觀 和 In-Memory OLTP 概觀和使用情境 物件有自己的記憶體管理員,這可讓您更輕鬆地監視其緩衝池使用量。 如需詳細資訊,請參閱 sys.dm_os_memory_clerks。
在舊版 SQL Server 中,記憶體使用率幾乎沒有上限,表示對 SQL Server 來說,所有系統記憶體都可供使用。 建議在所有版本的 SQL Server 中,藉由設定 來設定 max server memory (MB)SQL Server 記憶體使用率的上限。
- 自 SQL Server 2019 (15.x) 開始,Windows 伺服器中的 SQL 安裝程式會根據安裝時可用系統記憶體的百分比,針對獨立 SQL Server 執行個體提供建議
max server memory (MB)。 - 您可以隨時透過 和
min server memory (MB)組態選項,max server memory (MB)重新設定 SQL Server 執行個體所使用的 SQL Server 進程的記憶體界限 (以 MB 為單位)。
注意
本指南指的是 Windows 上的 SQL Server 執行個體。 如需 Linux 中記憶體設定的資訊,請參閱 Linux 上的 SQL Server 效能最佳做法和設定指導方針和 memory.memorylimitmb 設定。
建議
這些選項的預設設定和最小允許值如下:
| 選項 | 預設 | 最小的允許值 | 建議 |
|---|---|---|---|
min server memory (MB) |
0 | 0 | 0 |
max server memory (MB) |
2,147,483,647 MB | 128 MB | 其他流程未耗用的 75% 可用系統記憶體,包括其他執行個體。 如需更詳細的建議,請參閱最大伺服器記憶體。 |
在這些界限內,SQL Server 可以根據可用的系統資源,以動態方式變更其記憶體需求。 如需詳細資訊,請參閱動態記憶體管理。
- 設定值太高可能會導致
max server memory (MB)單一 SQL Server 執行個體與裝載在相同主機上的其他 SQL Server 執行個體競爭記憶體。 - 不過,設定
max server memory (MB)太低會失去效能機會,而且可能會導致 SQL Server 執行個體中的記憶體壓力和效能問題。 - 設定為最小值甚至
max server memory (MB)會防止 SQL Server 啟動。 如果您在變更此選項之後無法啟動 SQL Server,請使用啟動選項啟動-f它,並重設max server memory (MB)為先前的值。 如需詳細資訊,請參閱 Database Engine Service Startup Options。 - 不建議設定
max server memory (MB)和min server memory (MB)為相同的值,或接近相同的值。
注意
最大伺服器記憶體選項只會限制 SQL Server 緩衝集區的大小。 [最大伺服器記憶體] 選項不會限制 SQL Server 為擴充預存程序、COM 物件、非共用 DLL 和 EXE 等其他元件配置而剩餘未保留記憶體區域。
SQL Server 可以動態使用記憶體。 但您可以手動設定記憶體選項,並限制 SQL Server 可存取的記憶體數量。 在設定 SQL Server 的記憶體量之前,請從實體記憶體總計中減去作業系統 (OS) 所需的記憶體、不受設定 max server memory (MB) 控制的記憶體配置,以及任何其他 SQL Server 執行個體 (以及其他系統用途,如果伺服器是耗用記憶體的其他應用程式的所在地,則決定適當的記憶體設定, 包括 SQL Server 的其他實例)。 此差額即為可指派給目前 SQL Server 執行個體的記憶體數量上限。
在所有 SQL Server 版本中,最多可將記憶體設定為處理虛擬位址空間的上限。 如需詳細資訊,請參閱 Windows 與 Windows Server 版本的記憶體限制。
最小伺服器記憶體
用 min server memory (MB) 來保證 SQL Server 記憶體管理員可用的記憶體量下限。
SQL Server 不會立即配置啟動時指定的
min server memory (MB)記憶體數量。 不過,記憶體使用量因用戶端負載而達到此值之後,除非 的min server memory (MB)值減少,否則 SQL Server 無法釋放記憶體。 例如,當多個 SQL Server 執行個體同時安裝在相同的伺服器中時,請考慮將參數設定min server memory (MB)為保留執行個體的記憶體。在虛擬化環境中設定
min server memory (MB)值至關重要,以確保基礎主機的記憶體壓力不會嘗試從客體虛擬機器 (VM) 上的緩衝集區解除配置記憶體,超出可接受效能所需的記憶體。 在理想情況下,虛擬機器中的 SQL Server 執行個體不需要與虛擬主機主動式記憶體解除配置流程競爭。SQL Server 不保證配置 中
min server memory (MB)指定的記憶體數量。 如果伺服器上的負載從不需要配置中min server memory (MB)指定的記憶體數量,則 SQL Server 會使用較少的記憶體。
最大伺服器記憶體
用 max server memory (MB) 來保證 OS 和其他應用程式不會遇到來自 SQL Server 的有害記憶體壓力。
- 設定
max server memory (MB)設定之前,請在正常作業期間監視裝載 SQL Server 執行個體之伺服器的整體記憶體耗用量,以判斷記憶體可用性和需求。 針對初始設定,或當沒有機會收集一段時間內的 SQL Server 進程記憶體使用量時,請使用下列一般化最佳做法方法來設定max server memory (MB)單一執行個體:- 從 OS 記憶體總計中,減去控制之外
max server memory (MB)的潛在 SQL Server 執行緒記憶體配置的對等值,這是 堆疊大小1 乘以 計算的背景工作執行緒上限2。 - 然後,針對控制之外
max server memory (MB)的其他記憶體配置減去 25%,例如備份緩衝區、擴充預存程式 DLL、使用自動化程式 (呼叫)sp_OA所建立的物件,以及來自連結伺服器提供者的配置。 這是一般近似值,而且您所需的時間也可能不同。 - 剩下的應該是
max server memory (MB)單一執行個體設定的設定。
- 從 OS 記憶體總計中,減去控制之外
1 如需每個架構之執行緒堆疊大小的資訊,請參閱記憶體管理架構指南。
2 如需目前主機中指定數目親和化 CPU 之計算預設背景工作線程的詳細資訊,請參閱 伺服器組態:最大背景工作線程。
手動設定選項
伺服器選項 min server memory (MB) ,可以 max server memory (MB) 設定為跨越記憶體值範圍。 這樣的做法有助於讓系統或資料庫管理員將 SQL Server 執行個體配合同一部主機上執行的其他應用程式或其他 SQL Server 執行個體的記憶體需求,一併設定。
使用 Transact-SQL
和min server memory (MB)選項是max server memory (MB)進階選項。 使用 sp_configure 系統預存程序來變更這些設定時,只有當 [顯示進階選項] 設為 1 時,才能進行變更。 這些設定會立即生效,不需要重新啟動伺服器。 如需詳細資訊,請參閱 sp_configure。
下列範例將選項設定 max server memory (MB) 為 12,288 MB 或 12 GB。 雖然 sp_configure 將選項的名稱指定為 max server memory (MB),但您可以省略 (MB)。
EXECUTE sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXECUTE sp_configure 'max server memory', 12288;
GO
RECONFIGURE;
GO
下列查詢會傳回目前設定值和目前使用值的相關資訊。 不論 sp_configure 選項「顯示進階選項」是否為已啟用,此查詢都會傳回結果。
SELECT [name],
[value],
[value_in_use]
FROM sys.configurations
WHERE [name] = 'max server memory (MB)'
OR [name] = 'min server memory (MB)';
使用 SQL Server Management Studio
使用 min server memory (MB) 和 max server memory (MB) 來重新設定 SQL Server 記憶體管理員針對 SQL Server 執行個體所管理的記憶體數量 (以 MB 為單位)。
在物件總管中,請以滑鼠右鍵按一下伺服器,然後選取 [屬性]。
選取 [伺服器屬性] 視窗的 [記憶體] 頁面。 會顯示 [最小伺服器記憶體] 和 [最大伺服器記憶體] 的目前值。
在 [伺服器記憶體選項] 中的 [最小伺服器記憶體] 和 [最大伺服器記憶體] 中,輸入想要的數字。 如需建議,請參閱本文中的最小伺服器記憶體 (MB) 和最大伺服器記憶體 (MB)。
下列螢幕擷取畫面示範所有三個步驟:
鎖定記憶體中的分頁 (LPIM)
以 Windows 為基礎的應用程式可以使用 Windows 位址視窗延伸模組 (AWE) API,將實體記憶體配置並對應至流程位址空間。 LPIM Windows 原則決定哪些帳戶可以存取 API,將資料保留在實體記憶體中,防止系統將資料分頁到磁碟上的虛擬記憶體。 使用 AWE 配置的記憶體會遭到鎖定,直到應用程式明確釋放或結束為止。 在 64 位元 SQL Server 中使用 AWE API 來管理記憶體,通常也稱為鎖定的頁面。 將記憶體分頁到磁碟時,鎖定記憶體分頁可能會讓伺服器保持回應狀態。 在 SQL Server Standard 版本或更新版本的執行個體中,當具有 執行權限的帳戶取得 Windows 鎖定記憶體中的分頁 (LPIM) 使用者權利時,[鎖定記憶體中的分頁] 選項會設定為 [啟用]。
若要停用 SQL Server 的 [鎖定記憶體中的分頁] 選項,請將具有執行 啟動帳戶權限之帳戶 (SQL Server 啟動帳戶) 的 [鎖定記憶體中的分頁] 使用者權利移除。
使用 LPIM 並不會影響 SQL Server 動態記憶體管理,使其可依其他記憶體 Clerk 的要求來擴充或縮減。 使用 [鎖定記憶體中的頁面] 使用者權限時,強烈建議設定 的 max server memory (MB)上限。 如需詳細資訊,請參閱最大伺服器記憶體 (MB)。
出現 sqlservr 流程移出分頁的跡象時應使用 LPIM。在此情況下,錯誤記錄檔中會回報錯誤 17890,類似如下範例:
A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: #### seconds. Working set (KB): ####, committed (KB): ####, memory utilization: ##%.
將 LPIM 與不正確設定 max server memory (MB) 的設定搭配使用,而該設定不會考慮系統中的其他記憶體取用者,可能會導致不穩定,視其他進程所需的記憶體數量,或 範圍 max server memory (MB)之外的 SQL Server 記憶體需求而定。 如需詳細資訊,請參閱最大伺服器記憶體。 如果授與記憶體 中的鎖定頁面 (LPIM) 許可權 (在 32 位或 64 位系統上) ,強烈建議您設定 max server memory (MB) 為特定值,而不是保留預設值 2,147,483,647 MB。
注意
從 SQL Server 2012 (11.x) 開始,Standard Edition 不需要 追蹤旗標 845 即可使用鎖定的頁面。
啟用 [鎖定記憶體中的分頁]
在考慮先前的資訊之後,若要將權限授與 SQL Server 執行個體的服務帳戶,以啟用 [鎖定記憶體中的分頁] 選項,請參閱在記憶體中啟用鎖定頁面選項 (Windows)。
若要判斷 SQL Server 執行個體的服務帳戶,請參閱 SQL Server 組態管理員或從 service_account 查詢 sys.dm_server_services。 如需詳細資訊,請參閱 sys.dm_server_services。
檢視鎖定記憶體中的分頁狀態
若要判斷是否將 [鎖定記憶體中的分頁] 權限授與 SQL Server 執行個體的服務帳戶,請使用下列查詢。 SQL Server 2016 (13.x) SP1 和更新版本中支援此查詢。
SELECT sql_memory_model_desc FROM sys.dm_os_sys_info;
sql_memory_model_desc 的下列值表示 LPIM 的狀態:
-
CONVENTIONAL。 不會授與鎖定記憶體中分頁的權限。 -
LOCK_PAGES。 會授與鎖定記憶體中分頁的權限。 -
LARGE_PAGES。 在啟用追蹤旗標 834 後授與企業模式中鎖定頁面於記憶體中的權限。 這是進階設定,不建議用於大部分的環境。 如需詳細資訊和重要注意事項,請參閱追蹤 旗標 834。
使用下列方法來判斷 SQL Server 執行個體是否使用鎖定的頁面:
下列 Transact-SQL 查詢的輸出會指出
locked_page_allocations_kb的非零值:SELECT osn.node_id, osn.memory_node_id, osn.node_state_desc, omn.locked_page_allocations_kb FROM sys.dm_os_memory_nodes AS omn INNER JOIN sys.dm_os_nodes AS osn ON (omn.memory_node_id = osn.memory_node_id) WHERE osn.node_state_desc <> 'ONLINE DAC';目前的 SQL Server 錯誤記錄檔會在伺服器啟動期間報告訊息
Using locked pages in the memory manager。DBCC MEMORYSTATUS 輸出的 [記憶體管理員] 區段會顯示
AWE Allocated項目的非零值。
SQL Server 的多重執行個體
當您執行資料庫引擎的多個執行個體時,有不同的方式可以用來管理記憶體:
在
max server memory (MB)每個實例中使用來控制記憶體使用量, 如先前所述。 建立每一個執行個體的最大設定值,注意,扣除總額不大於機器的總實體記憶體。 您想要提供與執行個體的預期工作負載或資料庫大小成比例的記憶體給每一個執行個體。 此方式的優點是當新的處理序或執行個體啟動時,立刻有記憶體可用。 缺點是,如果您執行的不是所有執行個體,則任何執行中執行個體都不能利用剩餘可用的記憶體。在
min server memory (MB)每個實例中使用來控制記憶體使用量, 如先前所述。 建立每一個執行個體的最小設定值,使這些最小值的總和小於機器的總實體記憶體 1 - 2 GB。 同樣地,您可以建立與該執行個體的預期負載成比例的最小值。 此方式的優點是,若沒有同時執行所有執行個體,則執行的執行個體可使用剩餘可用的記憶體。 當電腦上有另一個記憶體密集流程時,此方法也很有用,因為其可確保 SQL Server 至少取得合理的記憶體數量。 其缺點是,當新的執行個體 (或任何其他處理序) 啟動時,執行中的執行個體可能需要花一些時間來釋出記憶體,尤其如果它們必須將已修改的頁面寫回其資料庫才能這麼做的話。max server memory (MB)在每個執行個體中使用 和min server memory (MB)來控制記憶體使用量,在廣泛的潛在記憶體使用率層級內觀察和調整每個執行個體的最大使用率和最小記憶體保護。不執行任何動作 (不建議)。 有呈現工作負載的前幾個執行個體傾向於配置所有記憶體。 閒置執行個體或稍後啟動的執行個體最後可能只剩少量的記憶體可用。 SQL Server 不會嘗試在執行個體之間平衡記憶體使用量。 不過,所有執行個體將回應 Windows 記憶體通知訊號,以便調整其記憶體使用量的大小。 Windows 不會平衡具有記憶體通知 API 的應用程式之間的記憶體。 它只提供對系統上記憶體可用性的全域回應。
您可以變更這些設定,而不必重新啟動執行個體,因此,您可以輕易體驗來尋找使用模式的最佳設定。
範例
A。 將 [最大伺服器記憶體] 選項設定為 4 GB
下列範例將選項設定 max server memory (MB) 為 4096 MB 或 4 GB。 雖然 sp_configure 將選項的名稱指定為 max server memory (MB),但您可以省略 (MB)。
EXECUTE sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXECUTE sp_configure 'max server memory', 4096;
GO
RECONFIGURE;
GO
這會輸出類似 Configuration option 'max server memory (MB)' changed from 2147483647 to 4096. Run the RECONFIGURE statement to install. 的陳述式。新記憶體限制會在執行 RECONFIGURE 時立即生效。 如需詳細資訊,請參閱 sp_configure。
B. 決定目前的記憶體配置
以下查詢會傳回目前配置之記憶體的相關資訊。
SELECT physical_memory_in_use_kb / 1024 AS sql_physical_memory_in_use_MB,
large_page_allocations_kb / 1024 AS sql_large_page_allocations_MB,
locked_page_allocations_kb / 1024 AS sql_locked_page_allocations_MB,
virtual_address_space_reserved_kb / 1024 AS sql_VAS_reserved_MB,
virtual_address_space_committed_kb / 1024 AS sql_VAS_committed_MB,
virtual_address_space_available_kb / 1024 AS sql_VAS_available_MB,
page_fault_count AS sql_page_fault_count,
memory_utilization_percentage AS sql_memory_utilization_percentage,
process_physical_memory_low AS sql_process_physical_memory_low,
process_virtual_memory_low AS sql_process_virtual_memory_low
FROM sys.dm_os_process_memory;
C. 檢視 max server memory (MB) 的值
下列查詢會傳回目前設定值和使用值的相關資訊。 不論 sp_configure 選項「顯示進階選項」是否為已啟用,此查詢都會傳回結果。
SELECT [value], [value_in_use]
FROM sys.configurations
WHERE [name] = 'max server memory (MB)';