SQL Server 2000+ 採用動態記憶體管理:啟動時根據作業系統可用記憶體自動計算目標記憶體 (Target Server Memory),運行中持續平衡 Buffer Pool、Plan Cache、Workspace Memory、Lock Memory 等消費者。原則上無需手動干預,但在特定場景下調整配置選項可獲得更穩定效能。
Max Server Memory = 總實體記憶體 - OS 保留 - 非 BP 分配 (Columnstore/In-Memory OLTP/CLR/Thread Stack/Linked Server/Backup Buffers) - 安全裕度| 實體記憶體 | OS 保留 | 建議 Max Server Memory |
|---|---|---|
| 16 GB | 4 GB | 11 GB |
| 32 GB | 6 GB | 24 GB |
| 64 GB | 8 GB | 52 GB |
| 128 GB | 12 GB | 110 GB |
| 256 GB+ | 16-24 GB | 總量 - 20 GB |
min server memory = max server memory (固定記憶體,喪失動態平衡能力)sys.dm_os_schedulers current_workers_count、work_queue_count、THREADPOOL 等待統計max server memory、Resource Governor 限制)
-- 建立資源池:限制報表工作負載最多佔用 30% 記憶體
CREATE RESOURCE POOL ReportPool WITH (MAX_MEMORY_PERCENT = 30);
CREATE WORKLOAD GROUP ReportGroup USING ReportPool;
-- 分類器函數依 APP_NAME/USER/DB 導向工作負載群組
適用於多租戶、混合工作負載 (OLTP + OLAP + ETL) 環境,硬性保障核心業務記憶體。
-- 記憶體配置總覽
SELECT
(physical_memory_in_use_kb/1024) AS sql_mem_mb,
(locked_page_allocations_kb/1024) AS locked_mb,
(virtual_address_space_committed_kb/1024) AS vmem_mb,
(large_page_allocations_kb/1024) AS large_mb
FROM sys.dm_os_process_memory;
-- Buffer Pool 使用細目
SELECT
type,
SUM(pages_kb)/1024 AS mb
FROM sys.dm_os_memory_clerks
GROUP BY type
ORDER BY mb DESC;
-- 記憶體授予等待
SELECT * FROM sys.dm_exec_query_memory_grants WHERE grant_time IS NULL;
-- THREADPOOL 等待
SELECT wait_type, waiting_tasks_count, wait_time_ms, max_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type = 'THREADPOOL';
max server memory 為「實體記憶體 - OS/非BP 預留」THREADPOOL 等待或記憶體壓力時調整 max worker threads/min memory per query