SQL Server 內存管理分動態分配(默認)與靜態分配兩種模式。理解其工作原理、配置參數、監控指標,能有效解決「內存被吃光」、「內存不足導致換頁」、「多實例爭用」等生產難題。
Min Server Memory,隨負載增長向 OS 申請,最高至 Max Server Memory;內存壓力時通過 Lazy Writer 釋放乾淨頁、Memory Broker 回收緩存,歸還 OS。Min Server Memory (MB):下限保障,防止被 OS 回收過度。建議設為 Max 的 50-80%。Max Server Memory (MB):必須顯式設置,留 4-8 GB 給 OS/驅動/備份/防毒。公式:物理內存 - OS預留(4-8GB) - 其他進程。Max Server Memory 大小的物理內存(需啟用 Lock Pages in Memory 特權),永不釋放、永不擴展。Lock Pages in Memory + 靜態分配行為。| 組成 | 說明 | 優化手段 |
|---|---|---|
| 緩存池 | 數據頁、索引頁、執行計畫 | 適當增大 Max Memory、索引維護減少碎片、參數化復用計畫 |
| 查詢工作區 | 排序、雜湊、並行交換、游標 | 避免大排序/雜湊、適當 MAXDOP、優化查詢減少 Tempdb 溢寫 |
| 其他 | 鎖結構、連接上下文、CLR、備份緩衝、AlwaysOn 日誌緩存 | 監控 sys.dm_os_memory_clerks 定位大戶 |
-- 1. 實例內存佔用總覽
SELECT
physical_memory_in_use_kb/1024 AS SQL_Mem_MB,
locked_page_allocations_kb/1024 AS Locked_MB,
virtual_address_space_reserved_kb/1024 AS VAS_Reserved_MB
FROM sys.dm_os_process_memory;
-- 2. 緩存池細分
SELECT type, name, pages_kb/1024 AS MB
FROM sys.dm_os_memory_clerks
WHERE pages_kb > 102400 -- >100MB
ORDER BY pages_kb DESC;
-- 3. 緩存命中率(累計值,需定期採樣計算增量)
SELECT cntr_value AS BufferCacheHitRatio_Base
FROM sys.dm_os_performance_counters
WHERE counter_name = 'Buffer cache hit ratio';
Buffer Cache Hit Ratio 持續 < 90%(增量計算) → 內存不足或熱數據集超過緩存。Page Life Expectancy (PLE) < 300 秒 → 頻繁換頁,需擴容或優化掃描查詢。Memory Grants Pending > 0 持續 → 查詢排隊等待記憶體授予,檢查大查詢/並行度。Target Server Memory ≫ Total Server Memory → 內存增長受限(Max 設置過低或 OS 壓力)。Min/Max 為峰值工作集 ± 10%。Lock Pages in Memory(需特權賬號運行服務),防止實例間互搶導致換頁。動態分配 + 顯式 Max Server Memory 是 95% 場景的最優解。靜態/保留內存僅作為多實例隔離、極致穩定性的進階手段。持續監控 PLE、命中率、Memory Grants,配合查詢調優(減少大掃描/排序/雜湊),才是內存管理的正道。