案例:記憶體升級後 SQL Server 佔用過高擠壓共存應用
環境:Windows Server 2003,RAM 512MB → 1GB。升級後 SQL Server 工作集從 400MB 飆升至 900MB+,導致同機其他應用程式出現「記憶體配置不足」錯誤。
根因:緩衝集區動態增長機制
- SQL Server 啟動後根據作業系統回報的可用實體記憶體,動態擴大緩衝集區。
- 目標:維持可用實體記憶體在 4MB~10MB 區間 (避免 OS 頻繁分頁)。
- 結果:只要有「免費」記憶體,SQL Server 就會佔用,**不會主動釋放給其他非 SQL Server 應用程式**,除非 OS 發出低記憶體通知 (WM_LOWMEMORY) 或 SQL Server 內部壓力偵測。
解決方案:設定最大伺服器記憶體
透過 SSMS (Enterprise Manager) 圖形化介面或 T-SQL 限制緩衝集區上限,為 OS 與其他應用保留記憶體。
方法一:SSMS 圖形化介面 (SQL 2000/2005+)
- 右鍵伺服器實例 → 屬性 (Properties)。
- 選擇 記憶體 (Memory) 索引標籤。
- 取消勾選「動態配置記憶體」或直接設定:
- Minimum server memory (MB):建議 0 (允許釋放) 或保留基礎量 (如 256 MB)。
- Maximum server memory (MB):關鍵設定。依總記憶體預留 OS (1-2 GB) + 其他應用需求。
本案例 1GB RAM:建議設 600~700 MB (留 300-400 MB 給 OS/其他應用)。
方法二:T-SQL 腳本 (適用自動化部署)
-- 顯示進階選項
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
-- 設定最大記憶體 700 MB (單位 MB)
EXEC sp_configure 'max server memory (MB)', 700; RECONFIGURE;
-- 設定最小記憶體 128 MB (視需求)
EXEC sp_configure 'min server memory (MB)', 128; RECONFIGURE;
-- 驗證
EXEC sp_configure 'max server memory (MB)';
EXEC sp_configure 'min server memory (MB)';
進階選項:固定記憶體大小
- 若將
min server memory = max server memory = 同一數值 (如 700 MB),等同勾選「使用固定記憶體大小」。
- 優點:完全可預測記憶體佔用,避免動態調整開銷。缺點:啟動較慢 (需預先配置),無法應對臨時記憶體壓力釋放。
生效與驗證
- 設定後 **建議重啟 SQL Server 服務** 使記憶體管理器立即重新平衡 (雖動態生效,重啟最徹底)。
- 驗證:效能監視器 →
SQL Server:Memory Manager → Total Server Memory (KB) 應穩定在設定上限附近。
- 查詢 DMV (SQL 2005+):
SELECT * FROM sys.dm_os_process_memory;
最佳實踐建議 (現代版本 SQL 2012+)
- 專用伺服器原則:生產資料庫伺服器**勿共存**其他記憶體密集型應用 (SSIS, SSRS, IIS, AV 掃描)。
- Max Server Memory 設定公式:
Total RAM - (OS Reserve 1-4 GB) - (Other SQL Components: SSAS/SSRS/SSIS/Non-Buffer Pool) - (Cluster/HA Overhead)。
- 啟用鎖定記憶體頁面 (Lock Pages in Memory - LPIM):授予 SQL Server 服務帳號 `SeLockMemoryPrivilege`,防止 OS 將 Buffer Pool 分頁至磁碟 (需 Enterprise Edition / Standard 2016 SP1+)。配合 Max Memory 設定使用。
- 監控告警:設定 `Available MBytes` < 500 MB 或 `Target Server Memory > Max Server Memory` 持續告警。