為何 SQL Server 記憶體持續增長?
許多管理員困惑:明明設定了記憶體上限,SQL Server 卻未達上限就停止增長,或是持續佔用大量記憶體不釋放。這其實是設計使然,而非 Bug。
記憶體三大用途優先級
- 資料快取(最大宗):若記憶體充足,SQL Server 會將用過的資料與預測會用到的資料全數載入記憶體,直到記憶體不足才淘汰命中率低的頁面。這也是為何
STATISTICS IO 常顯示 physical reads = 0。
- 查詢執行開銷:Hash Join、排序、中繼表、游標會消耗大量記憶體;Merge Join 與 Nested Loop 開銷較小。解決之道:在連接與排序欄位建立索引、避免游標與中繼表。
- 執行計畫與系統中繼資料:佔用極小,通常可忽略。
何時需要限制最大記憶體?
- 共存其他應用程式(如 IIS、應用伺服器)時:雖然 SQL Server 會在記憶體壓力下釋放,但執行緒切換與 I/O 等待會造成效能抖動。必須設定 max server memory 保留給作業系統與其他應用的空間。
- 專用資料庫伺服器:不建議限制,讓 SQL Server 充分利用記憶體發揮最大效能。
設定最大記憶體的兩種方式
- 企業管理器 → 伺服器屬性 → 「記憶體」索引標籤 → 設定「最大記憶體」。
- T-SQL:
sp_configure 'max server memory', 4096; RECONFIGURE;(單位 MB)。
查詢端記憶體優化原則
- 避免不必要的排序、Hash Join、游標、中繼表。
- 在 JOIN、WHERE、ORDER BY 欄位建立適當索引。
- 監控
Memory Grants Pending 與 Query Memory Grants 計數器,發現長期等待授權記憶體時優化查詢或增加記憶體。
總結
理解 SQL Server 記憶體管理機制,依部署架構決定是否設定上限,並從查詢層面減少不必要的記憶體壓力,才是解決「記憶體佔用過高」的根本之道。