32 位元 Windows (Server 2003/2008) 預設僅給用戶模式 2GB 記憶體,SQL Server 實際可用更少。透過 /3GB 啟動參數、啟用 AWE (Address Windowing Extensions)、鎖定記憶體頁面、設定 max server memory,可突破 4GB 限制,將多餘記憶體轉化為緩衝池,大幅提升查詢效能。本文提供完整配置步驟與多實例記憶體分配策略。
# 1. 編輯 boot.ini (Server 2003) 或 bcdedit (Server 2008/Vista+)
# Server 2003:
# [boot loader]
# timeout=30
# default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
# [operating systems]
# multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003" /fastdetect /3GB
# Server 2008+:
bcdedit /set IncreaseUserVa 3072
# 2. 重啟作業系統
shutdown /r /t 0
效果:用戶模式虛擬地址空間從 2GB → 3GB,核心模式 1GB。SQL Server 進程可定址 3GB,Buffer Pool 可擴大 ~1GB。
前提:Enterprise/Datacenter Edition、物理記憶體 > 4GB、已啟用 /3GB 或 /PAE (Physical Address Extension)。
-- 1. 授予「鎖定記憶體頁面」權限 (本地安全性原則)
# 控制台 → 管理工具 → 本地安全性原則 → 本地原則 → 使用者權利指派
# 「鎖定記憶體中的頁面」 → 添加 SQL Server 服務帳號 (如 DOMAIN\sqlsvc)
-- 2. 啟用 AWE (需 sysadmin)
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'awe enabled', 1; RECONFIGURE;
-- 重啟 SQL Server 服務生效
-- 忽略錯誤訊息 "AWE requires 32-bit..." (舊版 Bug,不影響功能)
-- 3. 限制檔案系統緩存佔用記憶體
# 網路連線 → 區域連線 → 內容 → 檔案與印表機共享 → 內容
# 取消勾選「最大化網路應用程式資料輸送量」 (優化為「最小化記憶體使用」)
啟用 AWE 後,SQL Server 啟動時會**積極鎖定幾乎所有可用物理記憶體** (「佔著茅坑不拉屎」),擠壓作業系統與其他應用。必須設定上限。
-- 單實例:預留 2-4GB 給 OS
EXEC sp_configure 'max server memory (MB)', 12288; -- 16GB 機器留 4GB
RECONFIGURE;
-- 多實例 (SQL 2000 需手動分配,2005+ 支援動態平衡但建議手動)
-- 實例 A (ERP) 8GB
EXEC sp_configure 'max server memory (MB)', 8192; RECONFIGURE;
-- 實例 B (CRM) 4GB
EXEC sp_configure 'max server memory (MB)', 4096; RECONFIGURE;
-- 合計 ≤ 物理記憶體 - OS 預留
| 場景 | 風險 | 對策 |
|---|---|---|
| 單實例 + AWE | SQL Server 鎖定所有記憶體,OS 交換、服務凍結 | 強制設定 max server memory,預留 2-4GB OS |
| 多實例 (SQL 2000) | 第一個啟動的實例搶佔所有記憶體 | 每個實例必須設定 max server memory |
| 多實例 (SQL 2005+) | 動態平衡可能不符業務優先級 | 仍建議手動設定 max server memory,按業務權重分配 |
| 升級記憶體 | 新記憶體未被 SQL Server 使用 | 重啟 SQL Server 服務 (AWE 需重啟感知新記憶體) |
| 共存其他應用 (Exchange、IIS、檔案服務) | 記憶體爭用導致非 SQL 服務異常 | 先測量其他應用基準記憶體需求,升級後優先滿足再分配給 SQL |
-- 確認 AWE 啟用
SELECT * FROM sys.dm_os_process_memory
WHERE physical_memory_in_use_kb > 4194304; -- > 4GB
-- 確認鎖定頁面
SELECT sql_memory_model_desc FROM sys.dm_os_process_memory;
-- 期望輸出: 'LOCK_PAGES_ALLOCATOR' 或 'AWE_ALLOCATOR'
-- 監控記憶體使用
SELECT
(physical_memory_in_use_kb/1024) AS SQL_Memory_MB,
(locked_page_allocations_kb/1024) AS Locked_Pages_MB,
(virtual_address_space_reserved_kb/1024) AS VAS_Reserved_MB
FROM sys.dm_os_process_memory;
max server memory 仍為核心參數,建議設定為 物理記憶體 * 0.8 (扣除 OS、SSIS、SSAS、其他進程)。Lock Pages in Memory 權限 (64 位元同樣適用),防止 Buffer Pool 被分頁到磁碟。Resource Governor 限制特定工作負載記憶體授予,避免惡意查詢佔盡記憶體。