(本文內容與文章 87756 高度重複,此處為精簡整合版,補充實操細節。)
記憶體消耗三大來源
- 緩衝池: 資料/索引頁面快取。動態增長至上限或系統低記憶體通知。
- 查詢工作區: Hash Join、Sort、游標、Spool 運算子申請的記憶體授予。
- 其他: 鎖結構、執行計劃快取、連線上下文等。
配置「最大伺服器記憶體」
- SSMS:右鍵伺服器 → 屬性 → 記憶體 → 最大伺服器記憶體 (MB)。
- T-SQL:
EXEC sp_configure 'max server memory (MB)', 4096; RECONFIGURE;
- 建議值:
專用 DB:總 RAM × 0.85
共存 Web/App:總 RAM × 0.6
留 1-4 GB 給 OS(視總量)。
查詢層面降低記憶體授予
- **索引優化:** Join/排序欄位加索引 → 避免 Hash Match/Sort 溢寫 tempdb。
- **避免 SELECT *:** 僅取必要欄位,減少資料行大小與傳輸量。
- **分頁查詢:** 大結果集用
OFFSET/FETCH 或 ROW_NUMBER 分頁,避免一次性大量授予。
- **拆分大查詢:** 複雜報表拆為多步驟,中繼結果落地暫存表。
監控關鍵指標
Performance Monitor:SQL Server:Memory Manager → Total Server Memory / Target Server Memory。
DBCC MEMORYSTATUS 詳細分佈。
sys.dm_exec_query_memory_grants 觀察等待/授予狀況。
**核心心法:** 記憶體給緩衝池是投資回報率最高;給查詢工作區是必要成本,**優化查詢讓每 MB 都花在刀口上**。