SQL Server 「吃光記憶體」是 DBA 最常遇到的誤解之一。實則這是其設計機制:主動緩存熱點資料以極致提升讀取效能。本文深入剖析記憶體分配機制,提供科學配置與查詢優化雙軌解決方案。
SQL Server 將讀取的資料頁面、預讀預測頁面全部保留在緩衝池,直到記憶體壓力觸發 LRU 淘汰機制。這就是為何 STATISTICS IO 常顯示 physical reads = 0——資料早已在記憶體中。這不是洩漏,是特性。
對策:針對連接/排序欄位建立覆蓋索引,將 Hash Join 轉為 Nested Loops / Merge Join;避免不必要的排序與游標;優化查詢計畫減少記憶體授予請求。
編譯後的執行計畫、系統目錄緩存、鎖結構等,通常佔用較小且穩定。
不限制最大記憶體,讓 SQL Server 全權管理。作業系統保留 1-4 GB 即足夠(鎖定頁面記憶體權限 Lock Pages in Memory 可防分頁)。
必須設定 Max Server Memory,預留作業系統與其他進程所需記憶體:
EXEC sp_configure 'max server memory (MB)', 4096; RECONFIGURE;經驗值:總物理記憶體 - (OS 2-4GB + 其他進程峰值) = SQL Server Max Memory。
單純限制記憶體會導致緩存命中率下降、物理 I/O 激增、查詢變慢。真正解決之道在於:
sys.dm_exec_query_memory_grants / Query Store。OPTIMIZE FOR AD HOC WORKLOADS 減少單用計畫快取膨脹。關鍵效能計數器:
SQLServer:Buffer Manager \ Page Life Expectancy > 300 秒為健康SQLServer:Memory Manager \ Target Server Memory / Total Server Memory 收斂穩定SQLServer:Memory Manager \ Memory Grants Pending 持續為 0