MSSQL 記憶體使用機制深度解析
MSSQL 採**動態記憶體管理**,主要消耗三大類:
- 資料快取: 最大開銷。將熱點資料與預讀資料載入記憶體,直至記憶體壓力觸發淘汰低命中率頁面。故
STATISTICS IO 中 Physical Reads 常為 0。
- 查詢執行開銷: Hash Join、排序、中繼表、游標佔用大量記憶體。Merge Join、Nested Loop 相對輕量。**對 Join/排序欄位建立索引可大幅降低記憶體壓力。**
- 執行計劃與系統資料: 佔用極小,通常可忽略。
記憶體配置策略:視環境而定
專用資料庫伺服器:不限制最好
無其他應用爭搶記憶體時,快取越大越好,甚至可 DBCC PINTABLE 釘住關鍵表。預設動態管理即可。
共存環境(含 Web/App 伺服器):必須設定最大記憶體
MSSQL 會在壓力下釋放記憶體,但**執行緒切換、I/O 等待會造成效能抖動**。須在「屬性 → 記憶體」或 sp_configure 'max server memory' 設定上限:
- 純資料庫:總記憶體 80-90%
- 兼域控制器:60-70%
- 兼 Web 伺服器:建議 ≤ 60%
設定後重啟 SQL Server 服務生效。
查詢層面優化:降低記憶體峰值
- 避免中繼表、游標。
- Join/排序欄位加索引(轉 Hash Join 為 Merge/Nested Loop)。
- 僅選取必要欄位(
SELECT * 禁忌)。
**核心原則:** 記憶體給快取用是投資,給查詢執行用是成本。優化查詢,讓記憶體花在刀口上。