SQL Server 2025數據庫引擎新特性彙總
預覽功能(PREVIEW_FEATURES)
啓用 PREVIEW_FEATURES 數據庫作用域配置,以測試和探索向量索引等預覽功能。此設置允許您即使在 SQL Server 正式發佈後,仍可使用部分預覽功能。 通過此配置啓用的功能將在未來的累積更新中正式可用。一旦某個功能通過累積更新正式可用,該功能將不再需要 PREVIEW_FEATURES 配置。 這些功能僅供開發或測試使用,不建議在生產環境中使用。
USE HellasGateV2
GO
SELECT * FROM sys.database_scoped_configurations
WHERE [name] = 'PREVIEW_FEATURES'
GO
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO
擴展事件會話加入時間限制選項
- 説明
-
帶 MAX_DURATION 的自動停止 現在可以在創建或修改事件會話時指定 MAX_DURATION(以秒為單位),使其在設定時間後自動停止擴展事件會話。
-
資源管理 這有助於防止會話無限運行,避免消耗資源並生成過多診斷數據。
-
手動控制仍可用 可以隨時使用
ALTER EVENT SESSION ... STATE = STOP手動停止擴展事件會話。 -
靈活修改 可以使用
ALTER EVENT SESSION更改或移除擴展事件會話的時間限制,但會話必須先停止擴展事件會話。 -
系統視圖支持
sys.server_event_sessions視圖包含max_duration列,顯示擴展事件會話的持續時間(0 表示無限制)。
- 示例
CREATE EVENT SESSION [TimeBoundSession] ON SERVER
ADD EVENT sqlserver.sql_statement_completed
WITH (MAX_DURATION = 600, STARTUP_STATE = OFF); -- (例如 10分鐘,單位秒)
ALTER EVENT SESSION [TimeBoundSession] ON SERVER
WITH (MAX_DURATION = 1200); -- 修改為20分鐘
ALTER EVENT SESSION [TimeBoundSession] ON SERVER
WITH (MAX_DURATION = UNLIMITED);
ALTER EVENT SESSION [TimeBoundSession] ON SERVER STATE = STOP;
優化的 sp_executesql存儲過程
概述(Overview)
- 串行編譯(Serialized Compilation)
啓用後,sp_executesql 批處理會像存儲過程一樣編譯 —— 僅一個會話進行編譯,其他會話等待,減少冗餘執行計劃的生成。
- 執行計劃重用(Plan Reuse)
首次編譯後,其他會話會重用緩存的執行計劃,而非自行編譯,提升性能和緩存效率。
- 編譯鎖機制(Compile Lock Mechanism)
編譯鎖確保同一時間僅一個會話進行編譯,防止相同批處理的並行編譯。
- 推薦設置(Recommended Settings)
為獲得最佳效果,若啓用了自動更新統計信息,還應啓用ASYNC_STATS_UPDATE_WAIT_AT_LOW_PRIORITY,以避免長時間等待和排他鎖。
- 使用 T-SQL 啓用(Enable with T-SQL)
ALTER DATABASE SCOPED CONFIGURATION SET OPTIMIZED_SP_EXECUTESQL = ON;
執行計劃緩存(Plan Cache)
- 啓用OPTIMIZED_SP_EXECUTESQL可對 SQL Server 2025 的執行計劃緩存產生積極影響。
減少執行計劃冗餘(Reduced Plan Duplication) 相同的 sp_executesql 批處理(排除參數值)將僅編譯一次並共享同一執行計劃,最大程度減少執行計劃緩存中的冗餘條目。
- 提升執行計劃重用率(Improved Plan Reuse)
後續執行將重用已編譯的執行計劃,這可提升性能並減少編譯期間的 CPU 使用率。
- 串行編譯(Serialized Compilation)
同一時間僅一個會話編譯批處理,其他會話等待或重用執行計劃 —— 這避免了同一邏輯的多次同時編譯。
- 降低緩存碎片(Lower Cache Fragmentation)
通過避免同一執行計劃的多個版本,緩存保持更整潔、更高效。
- 首次編譯期間的潛在等待(Potential Waits During First Compilation)
會話在首次執行期間可能短暫等待編譯鎖,但這通常被長期的緩存收益所抵消。
內存使用(Memory Usage)
啓用OPTIMIZED_SP_EXECUTESQL可通過改進執行計劃的處理方式,對 SQL Server 2025 的內存使用產生積極影響。
- 內存使用優勢如下
- 更少的冗餘執行計劃(Fewer Duplicate Plans)
- 更整潔的執行計劃緩存(Cleaner Plan Cache)
- 更低的編譯開銷(Lower Compilation Overhead)
- 潛在注意問題
-
初始編譯鎖等待(Initial Compile Lock Waits)
-
執行計劃緩存壓力降低(Plan Cache Pressure Reduction)
ZSTD 數據庫備份壓縮算法
-
更快而且更高效
-
與舊的 '
MS_XPRESS' 算法相比,ZSTD 提供了更優的速度和壓縮比。 -
執行備份時使用指定的壓縮算法
BACKUP DATABASE [databasename] ... WITH COMPRESSION (ALGORITHM = ZSTD) -- 備份語句,指定壓縮算法為 ZSTD
- 服務器範圍的默認設置
使用以下語句將 ZSTD 設置為所有備份的默認壓縮算法:
-- 壓縮算法取值:0 = MS_XPRESS(默認),1 = 無,2 = XPRESS,3 = ZSTD
EXEC sp_configure 'backup compression algorithm', 3; -- 配置備份壓縮算法為 ZSTD
RECONFIGURE; -- 使配置生效
內存優化(XTP)相關文件和文件組的移除
現在可通過刪除所有內存優化文件和文件組,完全移除內存優化OLTP的相關表和數據文件—— 這在早期版本中無法實現。
- 驗證步驟
- 使用
sys.dm_db_xtp_undeploy_status檢查是否使用了內存優化表(deployment_state = 1 或 2)。
SELECT *
FROM sys.dm_db_xtp_undeploy_status;
- 刪除所有內存優化表相關對象
在移除數據文件之前,必須刪除所有內存優化表、表類型和本機編譯的存儲過程。
- 移除文件和文件組
使用 ALTER DATABASE ... REMOVE FILE 和 ALTER DATABASE ... REMOVE FILEGROUP 來刪除最後一個文件和文件組。
- 長時間運行的移除過程
如果移除停滯,執行 CHECKPOINT 命令並監控 sys.dm_db_xtp_undeploy_status視圖以跟蹤進度並解決事務日誌截斷問題。
列存儲索引的改進
- 有序非聚集列存儲索引
通過保持非聚集列存儲索引數據的排序狀態,提升了實時運營分析HTAP場景中的查詢性能。適用於對運營數據頻繁執行分析查詢的場景。SQL Server 2022已經提供了有序聚集列存儲索引功能。
- 有序列存儲索引的聯機創建 / 重建
現在可在CREATE INDEX或ALTER INDEX語句的ORDER子句中使用ONLINE = ON。即使是有序列存儲索引,也能在索引創建或重建期間實現停機時間最小化。
- 有序聚集列存儲索引的排序質量改進
在聯機創建有序聚集列存儲索引時,SQL Server 現在使用TempDB數據庫進行排序,而非內存排序。若MAXDOP = 1,索引生成的列段將完全有序且無重疊,提升查詢性能(通過列段消除)。雖然可能因TempDB數據庫 的I/O 增加從而增加構建時間,但在多數場景下收益超過成本。
- 收縮LOB頁面的改進
列存儲索引使用LOB頁面,DBCC SHRINKDATABASE和DBCC SHRINKFILE現在可移動列存儲索引中的 LOB 數據頁。這使得收縮操作在回收空間時更有效,此前版本中這一能力受限。
變更跟蹤(change tracking)改進
- 新清理策略
為大型變更跟蹤輔助表引入自適應淺度清理。
以增量步驟運行,減少資源使用並提升可擴展性。
- 默認啓用
在 SQL Server 2025 中,自適應淺度清理默認啓用。
它取代了 SQL Server 2022 及更早版本中使用的舊深度清理方法。
若要禁用自適應淺度清理,請全局啓用trace flag跟蹤標誌 8273。
- 安全清理點
清理基於由保留期和清理深度確定的安全點。
有助於避免大型表上的長時間阻塞操作。
- 收益
減少清理期間的 CPU 和 I/O 峯值。
對於具有大型變更跟蹤輔助表的環境更高效。
AlwaysOn可讀輔助副本的持久化統計信息
- 自動統計信息持久化
可讀輔助副本上創建的臨時統計信息,現在會自動持久化到主副本。
一旦持久化,這些統計信息會在所有副本間同步,從而提升查詢性能和一致性。
- 無需跟蹤標誌
與 SQL Server 2022(需要跟蹤標誌 12606)不同,該功能在 SQL Server 2025 中默認啓用。 在 SQL Server 2025 中使用跟蹤標誌 12606 會禁用該功能。
- sys.stats 視圖中的新字段
replica_role_id指示副本角色(1 = 主副本,2 = 輔助副本,依此類推)。replica_role_desc描述副本角色。replica_name創建統計信息的副本名稱。
- 功能亮點
- 即使完成持久化,臨時統計信息仍會保留在輔助副本上。
- 優化器會使用最佳可用的統計信息,無論其來源。
- 輔助副本仍可基於自身的數據視圖刷新過期統計信息。
- 監控與故障排除
- 使用擴展事件(
persisted_stats_operation)監控持久化操作。 - 常見錯誤消息包括:
- 9131:功能已禁用
- 9136:表/索引已刪除
- 9139:統計信息過大無法發送
對TempDB數據庫啓用加速數據庫恢復
現在可以對TempDB數據庫啓用加速數據庫恢復功能
收益
- 事務即時回滾
- 主動事務日誌截斷
- 有助於防止長時間事務回滾和 TempDB 事務日誌空間耗盡(這類情況可能導致數據庫停機)
重要性
在早期版本中,即使採用最小日誌記錄,TempDB 中長時間運行或失敗的事務(例如涉及臨時表或表變量的事務)也可能會導致:
- 事務日誌高使用率
- 事務回滾延遲
- 應用程序中斷
示例代碼
-- 啓用 tempdb 的加速數據庫恢復
ALTER DATABASE [tempdb]
SET ACCELERATED_DATABASE_RECOVERY = ON;
-- 驗證 tempdb數據庫是否啓用了加速數據庫恢復(ADR)
SELECT name,
is_accelerated_database_recovery_on
FROM sys.databases
WHERE name = 'tempdb';
TempDB數據庫空間資源治理
- 背景
防止失控查詢或工作負載消耗過多的 tempdb數據庫空間。
通過實施每個工作負載的限制,幫助提高可靠性並避免中斷。
- 設置方式
可以按工作負載組設置 tempdb 空間限制,方式如下:
GROUP_MAX_TEMPDB_DATA_MB -- 以 MB 為單位的固定大小。
GROUP_MAX_TEMPDB_DATA_PERCENT -- 佔 tempdb 總大小的百分比。
-- 若兩者都設置,固定限制優先。
- 監控資源使用
sys.resource_governor_workload_groups視圖顯示已配置的限制
sys.dm_resource_governor_workload_groups視圖顯示當前和峯值的 tempdb 使用率
擴展事件:tempdb_data_workload_group_limit_reached 當某個工作負載組超出其限制時觸發
- 最佳實踐
避免將限制設置得過低,尤其是默認工作負載組。
如果工作負載不太可能同時達到峯值,可在多個組之間超額配置限制(例如,總限制超過 tempdb 的 100%)。
預先設置好tempdb 數據文件大小和增長大小,並正確配置 MAXSIZE 和 FILEGROWTH,以使用基於百分比的限制。
- 限制
僅適用於tempdb數據文件,不適用於事務日誌文件。
版本存儲的使用(例如,用於加速數據庫恢復(ADR)的部分)不受治理。
空間按 8 KB 頁跟蹤,即使是部分使用的頁也會被跟蹤。
- 示例代碼
配置 tempdb 空間資源調控器
-- 啓用資源調控器
ALTER RESOURCE GOVERNOR RECONFIGURE;
-- 創建資源池
CREATE RESOURCE POOL rg_tempdb_pool;
-- 創建帶有 tempdb 空間限制(例如,500 MB)的工作負載組
CREATE WORKLOAD GROUP wg_tempdb_group
USING rg_tempdb_pool
WITH (GROUP_MAX_TEMPDB_DATA_MB = 500
-- 或使用 GROUP_MAX_TEMPDB_DATA_PERCENT = 10
);
-- 重新配置資源調控器
ALTER RESOURCE GOVERNOR RECONFIGURE;
監控 tempdb 使用率
-- 監控 tempdb 使用情況
-- 按工作負載組查看當前 tempdb 使用情況
SELECT
wg.name AS 工作負載組,
wg.group_id,
wg_stats.total_allocated_tempdb_kb / 1024.0 AS 已使用TempDB_MB,
wg_stats.max_allocated_tempdb_kb / 1024.0 AS TempDB_MB_峯值
FROM sys.dm_resource_governor_workload_groups AS wg_stats
JOIN sys.resource_governor_workload_groups AS wg
ON wg_stats.group_id = wg.group_id;
使用擴展事件監控限制違規
-- 使用擴展事件監控限制違規
CREATE EVENT SESSION [TempDBLimitMonitor] ON SERVER
ADD EVENT sqlserver.tempdb_data_workload_group_limit_reached
ADD TARGET package0.event_file
(
SET filename = N'TempDBLimitMonitor.xel',
max_file_size = 10,
max_rollover_files = 5
)
WITH (STARTUP_STATE = ON);
GO
優化鎖定
什麼是優化鎖定
- 一種新的鎖定機制,可減少鎖內存使用、最小化阻塞並避免鎖升級。
- 旨在為高吞吐量事務工作負載提升併發性和性能。
核心組成
- 事務ID鎖
- 每一行的最後存儲修改它的
事務ID。 - 不再持有大量行/頁鎖,而是持有一個單獨的
TID鎖,直到事務結束。 - 行/頁鎖在修改後立即釋放。
- 限定後鎖定
- 使用最新提交的行版本評估謂詞,而不獲取鎖。
- 僅在某行符合修改條件後才獲取鎖。
- 減少阻塞並提升併發性。
功能可用
| 平台 | 可用 | 默認啓用 |
|---|---|---|
| SQL Server 2025 (17.x) | ✔️ | ❌ |
| Azure SQL 數據庫 | ✔️ | ✔️ |
| Microsoft Fabric 中的 SQL 數據庫 | ✔️ | ✔️ |
| Azure SQL 託管實例(AUTD) | ✔️ | ✔️ |
| SQL Server 2022 及更早版本 | ❌ | ❌ |
啓用優化鎖定
示例代碼
ALTER DATABASE [YourDatabaseName] SET OPTIMIZED_LOCKING = ON;
前提條件
- 數據庫必須已經啓用了加速數據庫恢復(ADR)。
- 為了充分獲得限定後鎖定(LAQ)的優勢,數據庫應打開讀已提交快照(RCSI)隔離級別
ALTER DATABASE [你的數據庫名] SET READ_COMMITTED_SNAPSHOT ON;
監控
開啓了優化鎖定之後,使用下面手段監控鎖的情況
- 使用
sys.dm_tran_locks視圖觀察鎖行為。 - 新增的等待類型:
LCK_M_S_XACT_READ、LCK_M_S_XACT_MODIFY。 - 擴展事件
lock_after_qual_stmt_abort當 LAQ(限定後鎖定)被中止並重試時觸發。 - 擴展事件
locking_stats鎖使用情況和 LAQ/TID 活動的定期彙總。
本文版權歸作者所有,未經作者同意不得轉載。