博客 / 詳情

返回

SQL Server 2025數據庫引擎新特性彙總

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

擴展事件會話加入時間限制選項

  • 説明
  1. 帶 MAX_DURATION 的自動停止 現在可以在創建或修改事件會話時指定 MAX_DURATION(以秒為單位),使其在設定時間後自動停止擴展事件會話。

  2. 資源管理 這有助於防止會話無限運行,避免消耗資源並生成過多診斷數據。

  3. 手動控制仍可用 可以隨時使用ALTER EVENT SESSION ... STATE = STOP手動停止擴展事件會話。

  4. 靈活修改 可以使用ALTER EVENT SESSION更改或移除擴展事件會話的時間限制,但會話必須先停止擴展事件會話。

  5. 系統視圖支持 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存儲過程

unsetunset概述(Overview)unsetunset
  1. 串行編譯(Serialized Compilation)

啓用後,sp_executesql 批處理會像存儲過程一樣編譯 —— 僅一個會話進行編譯,其他會話等待,減少冗餘執行計劃的生成。

  1. 執行計劃重用(Plan Reuse)

首次編譯後,其他會話會重用緩存的執行計劃,而非自行編譯,提升性能和緩存效率。

  1. 編譯鎖機制(Compile Lock Mechanism)

編譯鎖確保同一時間僅一個會話進行編譯,防止相同批處理的並行編譯。

  1. 推薦設置(Recommended Settings)

為獲得最佳效果,若啓用了自動更新統計信息,還應啓用ASYNC_STATS_UPDATE_WAIT_AT_LOW_PRIORITY,以避免長時間等待和排他鎖。

  1. 使用 T-SQL 啓用(Enable with T-SQL)
ALTER DATABASE SCOPED CONFIGURATION SET OPTIMIZED_SP_EXECUTESQL = ON;
unsetunset執行計劃緩存(Plan Cache)unsetunset
  1. 啓用OPTIMIZED_SP_EXECUTESQL可對 SQL Server 2025 的執行計劃緩存產生積極影響。

減少執行計劃冗餘(Reduced Plan Duplication) 相同的 sp_executesql 批處理(排除參數值)將僅編譯一次並共享同一執行計劃,最大程度減少執行計劃緩存中的冗餘條目。

  1. 提升執行計劃重用率(Improved Plan Reuse)

後續執行將重用已編譯的執行計劃,這可提升性能並減少編譯期間的 CPU 使用率。

  1. 串行編譯(Serialized Compilation)

同一時間僅一個會話編譯批處理,其他會話等待或重用執行計劃 —— 這避免了同一邏輯的多次同時編譯。

  1. 降低緩存碎片(Lower Cache Fragmentation)

通過避免同一執行計劃的多個版本,緩存保持更整潔、更高效。

  1. 首次編譯期間的潛在等待(Potential Waits During First Compilation)

會話在首次執行期間可能短暫等待編譯鎖,但這通常被長期的緩存收益所抵消。

unsetunset內存使用(Memory Usage)unsetunset

啓用OPTIMIZED_SP_EXECUTESQL可通過改進執行計劃的處理方式,對 SQL Server 2025 的內存使用產生積極影響。

  • 內存使用優勢如下
  1. 更少的冗餘執行計劃(Fewer Duplicate Plans)
  2. 更整潔的執行計劃緩存(Cleaner Plan Cache)
  3. 更低的編譯開銷(Lower Compilation Overhead)
  • 潛在注意問題
  1. 初始編譯鎖等待(Initial Compile Lock Waits)

  2. 執行計劃緩存壓力降低(Plan Cache Pressure Reduction)


ZSTD 數據庫備份壓縮算法

  1. 更快而且更高效

  2. 與舊的 'MS_XPRESS' 算法相比,ZSTD 提供了更優的速度和壓縮比。

  3. 執行備份時使用指定的壓縮算法

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的相關表和數據文件—— 這在早期版本中無法實現。

  • 驗證步驟
  1. 使用 sys.dm_db_xtp_undeploy_status 檢查是否使用了內存優化表(deployment_state = 1 或 2)。
SELECT *
FROM sys.dm_db_xtp_undeploy_status;
  1. 刪除所有內存優化表相關對象

在移除數據文件之前,必須刪除所有內存優化表、表類型和本機編譯的存儲過程。

  1. 移除文件和文件組

使用 ALTER DATABASE ... REMOVE FILE 和 ALTER DATABASE ... REMOVE FILEGROUP 來刪除最後一個文件和文件組。

  1. 長時間運行的移除過程

如果移除停滯,執行 CHECKPOINT 命令並監控 sys.dm_db_xtp_undeploy_status視圖以跟蹤進度並解決事務日誌截斷問題。


列存儲索引的改進

  1. 有序非聚集列存儲索引

通過保持非聚集列存儲索引數據的排序狀態,提升了實時運營分析HTAP場景中的查詢性能。適用於對運營數據頻繁執行分析查詢的場景。SQL Server 2022已經提供了有序聚集列存儲索引功能。

  1. 有序列存儲索引的聯機創建 / 重建

現在可在CREATE INDEXALTER INDEX語句的ORDER子句中使用ONLINE = ON。即使是有序列存儲索引,也能在索引創建或重建期間實現停機時間最小化。

  1. 有序聚集列存儲索引的排序質量改進

在聯機創建有序聚集列存儲索引時,SQL Server 現在使用TempDB數據庫進行排序,而非內存排序。若MAXDOP = 1,索引生成的列段將完全有序且無重疊,提升查詢性能(通過列段消除)。雖然可能因TempDB數據庫 的I/O 增加從而增加構建時間,但在多數場景下收益超過成本。

  1. 收縮LOB頁面的改進

列存儲索引使用LOB頁面,DBCC SHRINKDATABASEDBCC SHRINKFILE現在可移動列存儲索引中的 LOB 數據頁。這使得收縮操作在回收空間時更有效,此前版本中這一能力受限。


變更跟蹤(change tracking)改進

  • 新清理策略

為大型變更跟蹤輔助表引入自適應淺度清理。

以增量步驟運行,減少資源使用並提升可擴展性。

  • 默認啓用

在 SQL Server 2025 中,自適應淺度清理默認啓用。

它取代了 SQL Server 2022 及更早版本中使用的舊深度清理方法。

若要禁用自適應淺度清理,請全局啓用trace flag跟蹤標誌 8273。

  • 安全清理點

清理基於由保留期和清理深度確定的安全點。

有助於避免大型表上的長時間阻塞操作。

  • 收益

減少清理期間的 CPU 和 I/O 峯值。

對於具有大型變更跟蹤輔助表的環境更高效。


AlwaysOn可讀輔助副本的持久化統計信息

  1. 自動統計信息持久化

可讀輔助副本上創建的臨時統計信息,現在會自動持久化到主副本

一旦持久化,這些統計信息會在所有副本間同步,從而提升查詢性能和一致性。

  1. 無需跟蹤標誌

與 SQL Server 2022(需要跟蹤標誌 12606)不同,該功能在 SQL Server 2025 中默認啓用。 在 SQL Server 2025 中使用跟蹤標誌 12606 會禁用該功能

  1. sys.stats 視圖中的新字段
  • replica_role_id 指示副本角色(1 = 主副本,2 = 輔助副本,依此類推)。
  • replica_role_desc 描述副本角色。
  • replica_name 創建統計信息的副本名稱。
  1. 功能亮點
  • 即使完成持久化,臨時統計信息仍會保留在輔助副本上。
  • 優化器會使用最佳可用的統計信息,無論其來源。
  • 輔助副本仍可基於自身的數據視圖刷新過期統計信息。
  1. 監控與故障排除
  • 使用擴展事件(persisted_stats_operation)監控持久化操作。
  • 常見錯誤消息包括:
    • 9131:功能已禁用
    • 9136:表/索引已刪除
    • 9139:統計信息過大無法發送

對TempDB數據庫啓用加速數據庫恢復

現在可以對TempDB數據庫啓用加速數據庫恢復功能

unsetunset收益unsetunset
  • 事務即時回滾
  • 主動事務日誌截斷
  • 有助於防止長時間事務回滾和 TempDB 事務日誌空間耗盡(這類情況可能導致數據庫停機)
unsetunset重要性unsetunset

在早期版本中,即使採用最小日誌記錄,TempDB 中長時間運行或失敗的事務(例如涉及臨時表或表變量的事務)也可能會導致:

  • 事務日誌高使用率
  • 事務回滾延遲
  • 應用程序中斷
unsetunset示例代碼unsetunset
-- 啓用 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 數據文件大小和增長大小,並正確配置 MAXSIZEFILEGROWTH,以使用基於百分比的限制。

  • 限制

僅適用於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

優化鎖定

unsetunset什麼是優化鎖定unsetunset
  • 一種新的鎖定機制,可減少鎖內存使用、最小化阻塞並避免鎖升級。
  • 旨在為高吞吐量事務工作負載提升併發性和性能。
unsetunset核心組成unsetunset
  1. 事務ID鎖
  • 每一行的最後存儲修改它的事務ID
  • 不再持有大量行/頁鎖,而是持有一個單獨的TID鎖,直到事務結束。
  • 行/頁鎖在修改後立即釋放。
  1. 限定後鎖定
  • 使用最新提交的行版本評估謂詞,而不獲取鎖。
  • 僅在某行符合修改條件後才獲取鎖。
  • 減少阻塞並提升併發性。
unsetunset功能可用unsetunset
平台 可用 默認啓用
SQL Server 2025 (17.x) ✔️
Azure SQL 數據庫 ✔️ ✔️
Microsoft Fabric 中的 SQL 數據庫 ✔️ ✔️
Azure SQL 託管實例(AUTD) ✔️ ✔️
SQL Server 2022 及更早版本
unsetunset啓用優化鎖定unsetunset

示例代碼

ALTER DATABASE [YourDatabaseName] SET OPTIMIZED_LOCKING = ON;
unsetunset前提條件unsetunset
  • 數據庫必須已經啓用了加速數據庫恢復(ADR)
  • 為了充分獲得限定後鎖定(LAQ)的優勢,數據庫應打開讀已提交快照(RCSI)隔離級別
    ALTER DATABASE [你的數據庫名] SET READ_COMMITTED_SNAPSHOT ON;
unsetunset監控unsetunset

開啓了優化鎖定之後,使用下面手段監控鎖的情況

  • 使用 sys.dm_tran_locks 視圖觀察鎖行為。
  • 新增的等待類型:LCK_M_S_XACT_READLCK_M_S_XACT_MODIFY
  • 擴展事件 lock_after_qual_stmt_abort 當 LAQ(限定後鎖定)被中止並重試時觸發。
  • 擴展事件 locking_stats 鎖使用情況和 LAQ/TID 活動的定期彙總。

 

 

本文版權歸作者所有,未經作者同意不得轉載。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.