動態記憶體管理機制
SQL Server (Windows NT/2000) **不預先配置固定記憶體**,而是在**不產生額外分頁 I/O** 前提下,**動態獲取盡可能多的可用記憶體**,同時保留 4-10 MB 給作業系統防止交換。
生命週期行為
- 啟動初始化:配置 8-12 MB 完成啟動
- 待機狀態:無使用者連接時不再獲取記憶體
- 工作負載增長:使用者連接、查詢執行 → 依需求持續獲取
- 達到目標:可用實體記憶體維持在 4-10 MB 區間
- 負載降低:釋放記憶體還給 OS,目標調整至 10 MB 可用端
目標記憶體計算邏輯
- 緩衝區頁面需求:滿足所有當前查詢所需資料頁數
- 頁壽命期 (Buffer Manager: Page Life Expectancy):
• 高需求/小緩衝區 → 短壽命 → 目標傾向 4 MB 可用端 (獲取更多記憶體)
• 低需求/大緩衝區 → 長壽命 → 目標傾向 10 MB 可用端 (釋放記憶體)
外部記憶體壓力回應
- 其他應用程式啟動消耗記憶體 → 可用記憶體低於目標 → SQL Server **釋放記憶體**
- 其他應用程式結束釋放記憶體 → 可用記憶體增加 → SQL Server **獲取記憶體**
- 調整速度:每秒可釋放/獲取數 MB,快速響應
手動限制:min/max server memory
| 選項 | 行為 |
| min server memory | 啟動時不立即配置;工作負載增長達到此值後**不再釋放低於此值** |
| max server memory | **絕對上限**,不會獲取超過此值的記憶體 |
| 兩者設相同值 | 達到該值後**停止動態調整**,固定記憶體配置 |
實務建議
- **專用資料庫伺服器**:保持預設動態管理,充分利用記憶體
- **共用伺服器** (多服務共存):設定
max server memory 保留記憶體給其他服務
- **叢集/虛擬化環境**:設定
min/max 相同值,確保可預測資源配置
- **監控指標**:
• SQL Server: Memory Manager - Target Server Memory
• SQL Server: Memory Manager - Total Server Memory
• Buffer Manager: Page Life Expectancy (建議 > 300 秒)
常見誤區澄清
- 「SQL Server 記憶體洩漏」→ 實為**設計預期行為** (動態獲取)
- 「設定 max memory 就能省記憶體」→ 若負載確實需要,設太低反而導致頻繁分頁、效能崩潰
- 「AWE/啟用 /3GB 開關」→ 32 位元版本突破 2GB/3GB 限制的獨立機制,非 min/max 設定