SQL Server 2016 引入 Database Scoped Configuration (資料庫範圍設定),將過去只能在執行個體層級透過 `sp_configure` 或追蹤旗標 (Trace Flags) 設定的關鍵選項,下放至**資料庫層級**獨立配置。這對多租戶、混合負載 (OLTP + 報表)、SharePoint 等共享實例場景極具價值。本文詳細解析四大核心選項與實務應用。
-- 查看目前資料庫設定
SELECT * FROM sys.database_scoped_configurations;
-- 修改設定 (需 ALTER ANY DATABASE SCOPED CONFIGURATION 權限)
ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 1;
ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = ON;
ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SNIFFING = OFF;
ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = ON;
| 選項 | 對應舊機制 | 功能說明 | 典型應用場景 |
|---|---|---|---|
| MAXDOP | `sp_configure 'max degree of parallelism'` | 限制平行查詢最大 CPU 核心數。資料庫層級覆蓋實例設定 (0 = 使用實例值)。 | SharePoint 資料庫設 1 避免 CXPACKET 等待;報表資料庫設 0/高值充分利用核心。 |
| LEGACY_CARDINALITY_ESTIMATION | Trace Flag 9481 (舊版) / 2312 (新版) | 控制基數估計器版本:ON = SQL Server 2012 之前 (70 版);OFF = SQL Server 2014+ (120+ 版)。 | 升級後查詢計畫退化時,單一資料庫暫時啟用舊版估計器回測,不影響其他資料庫。 |
| PARAMETER_SNIFFING | Trace Flag 4136 | ON (預設) = 啟用參數探查,依首次參數值編譯計畫;OFF = 忽略參數值,產生平均分佈計畫 (等同 `OPTIMIZE FOR UNKNOWN`)。 | 參數敏感度極高、計畫穩定性優於最佳化效能的資料庫 (如動態搜尋、參數分佈極不均)。 |
| QUERY_OPTIMIZER_HOTFIXES | Trace Flag 4199 | 控制查詢優化器修補程式 (Hotfixes) 是否啟用。ON = 啟用所有修補;OFF = 僅啟用 RTM 行為。 | 遇到已知優化器 Bug 導致錯誤計畫時,單一資料庫開啟修補驗證,避免實例級風險。 |
同一實例裝載:
無需開啟多個實例、無需資源調控器複雜配置,單一實例即可精細治理各資料庫行為。
啟用 `QUERY_OPTIMIZER_HOTFIXES` 後,優化器將包含所有累積更新 (CU) 中的修補邏輯。若特定 CU 引入回歸,可單一資料庫關閉驗證,極大降低生產環境套用 CU 風險。
資料庫範圍設定是 SQL Server 2016 最具實務價值的功能之一,將「實例級妥協」轉化為「資料庫級精準」,讓 DBA 能在共享實例架構下實現真正的負載隔離與效能治理。