诚德来全能服务 發表於 2025-11-14 08:41:57

SQL Server 2025数据库引擎新特性汇总

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">预览功能(PREVIEW_FEATURES)</a></li><li><a href="#_label1">扩展事件会话加入时间限制选项</a></li><li><a href="#_label2">优化的 sp_executesql存储过程</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_0">概述(Overview)</a></li><li><a href="#_lab2_2_1">执行计划缓存(Plan Cache)</a></li><li><a href="#_lab2_2_2">内存使用(Memory Usage)</a></li><li><a href="#_lab2_2_3">ZSTD 数据库备份压缩算法</a></li><li><a href="#_lab2_2_4">内存优化(XTP)相关文件和文件组的移除</a></li><li><a href="#_lab2_2_5">列存储索引的改进</a></li><li><a href="#_lab2_2_6">变更跟踪(change tracking)改进</a></li><li><a href="#_lab2_2_7">AlwaysOn可读辅助副本的持久化统计信息</a></li><li><a href="#_lab2_2_8">对TempDB数据库启用加速数据库恢复</a></li><li><a href="#_lab2_2_9">收益</a></li><li><a href="#_lab2_2_10">重要性</a></li><li><a href="#_lab2_2_11">示例代码</a></li><li><a href="#_lab2_2_12">TempDB数据库空间资源治理</a></li></ul><li><a href="#_label3">优化锁定</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_13">什么是优化锁定</a></li><li><a href="#_lab2_3_14">核心组成</a></li><li><a href="#_lab2_3_15">功能可用</a></li><li><a href="#_lab2_3_16">启用优化锁定</a></li><li><a href="#_lab2_3_17">前提条件</a></li><li><a href="#_lab2_3_18">监控</a></li></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>预览功能(PREVIEW_FEATURES)</h2>
<p>启用 PREVIEW_FEATURES 数据库作用域配置,以测试和探索向量索引等预览功能。此设置允许您即使在 SQL Server 正式发布后,仍可使用部分预览功能。 通过此配置启用的功能将在未来的累积更新中正式可用。一旦某个功能通过累积更新正式可用,该功能将不再需要 PREVIEW_FEATURES 配置。 这些功能仅供开发或测试使用,不建议在生产环境中使用。</p>
<div class="jb51code"><pre class="brush:sql;">USE HellasGateV2
GO
SELECT * FROM sys.database_scoped_configurations
WHERE = 'PREVIEW_FEATURES'
GO
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>扩展事件会话加入时间限制选项</h2>
<ul><li>说明<ul><li>带 MAX_DURATION 的自动停止 现在可以在创建或修改事件会话时指定 MAX_DURATION(以秒为单位),使其在设定时间后自动停止扩展事件会话。</li><li>资源管理 这有助于防止会话无限运行,避免消耗资源并生成过多诊断数据。</li><li>手动控制仍可用 可以随时使用<code>ALTER EVENT SESSION ... STATE = STOP</code>手动停止扩展事件会话。</li><li>灵活修改 可以使用<code>ALTER EVENT SESSION</code>更改或移除扩展事件会话的时间限制,但会话必须先停止扩展事件会话。</li><li>系统视图支持&nbsp;<code>sys.server_event_sessions</code>视图包含max_duration列,显示扩展事件会话的持续时间(0 表示无限制)。</li></ul></li><li>示例</li></ul>
<div class="jb51code"><pre class="brush:sql;">CREATE EVENT SESSION ON SERVER
ADD EVENT sqlserver.sql_statement_completed
WITH (MAX_DURATION = 600, STARTUP_STATE = OFF); -- (例如 10分钟,单位秒)
ALTER EVENT SESSION ON SERVER
WITH (MAX_DURATION = 1200); -- 修改为20分钟
ALTER EVENT SESSION ON SERVER
WITH (MAX_DURATION = UNLIMITED);
ALTER EVENT SESSION ON SERVER STATE = STOP;</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>优化的 sp_executesql存储过程</h2>
<p class="maodian"><a name="_lab2_2_0"></a></p><h3>概述(Overview)</h3>
<ul><li>串行编译(Serialized Compilation)</li></ul>
<p>启用后,sp_executesql 批处理会像存储过程一样编译 &mdash;&mdash; 仅一个会话进行编译,其他会话等待,减少冗余执行计划的生成。</p>
<ul><li>执行计划重用(Plan Reuse)</li></ul>
<p>首次编译后,其他会话会重用缓存的执行计划,而非自行编译,提升性能和缓存效率。</p>
<ul><li>编译锁机制(Compile Lock Mechanism)</li></ul>
<p>编译锁确保同一时间仅一个会话进行编译,防止相同批处理的并行编译。</p>
<ul><li>推荐设置(Recommended Settings)</li></ul>
<p>为获得最佳效果,若启用了自动更新统计信息,还应启用ASYNC_STATS_UPDATE_WAIT_AT_LOW_PRIORITY,以避免长时间等待和排他锁。</p>
<ul><li>使用 T-SQL 启用(Enable with T-SQL)</li></ul>
<div class="jb51code"><pre class="brush:sql;">ALTER DATABASE SCOPED CONFIGURATION SET OPTIMIZED_SP_EXECUTESQL = ON;</pre></div>
<p class="maodian"><a name="_lab2_2_1"></a></p><h3>执行计划缓存(Plan Cache)</h3>
<ul><li>启用OPTIMIZED_SP_EXECUTESQL可对 SQL Server 2025 的执行计划缓存产生积极影响。</li></ul>
<p>减少执行计划冗余(Reduced Plan Duplication) 相同的 sp_executesql 批处理(排除参数值)将仅编译一次并共享同一执行计划,最大程度减少执行计划缓存中的冗余条目。</p>
<ul><li>提升执行计划重用率(Improved Plan Reuse)</li></ul>
<p>后续执行将重用已编译的执行计划,这可提升性能并减少编译期间的 CPU 使用率。</p>
<ul><li>串行编译(Serialized Compilation)</li></ul>
<p>同一时间仅一个会话编译批处理,其他会话等待或重用执行计划 &mdash;&mdash; 这避免了同一逻辑的多次同时编译。</p>
<ul><li>降低缓存碎片(Lower Cache Fragmentation)</li></ul>
<p>通过避免同一执行计划的多个版本,缓存保持更整洁、更高效。</p>
<ul><li>首次编译期间的潜在等待(Potential Waits During First Compilation)</li></ul>
<p>会话在首次执行期间可能短暂等待编译锁,但这通常被长期的缓存收益所抵消。</p>
<p class="maodian"><a name="_lab2_2_2"></a></p><h3>内存使用(Memory Usage)</h3>
<p>启用OPTIMIZED_SP_EXECUTESQL可通过改进执行计划的处理方式,对 SQL Server 2025 的内存使用产生积极影响。</p>
<ul><li>内存使用优势如下<ul><li>更少的冗余执行计划(Fewer Duplicate Plans)</li><li>更整洁的执行计划缓存(Cleaner Plan Cache)</li><li>更低的编译开销(Lower Compilation Overhead)</li></ul></li><li>潜在注意问题<ul><li>初始编译锁等待(Initial Compile Lock Waits)</li><li>执行计划缓存压力降低(Plan Cache Pressure Reduction)</li></ul></li></ul>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>ZSTD 数据库备份压缩算法</h3>
<ul><li>更快而且更高效<ul><li>与旧的 &#39;<code>MS_XPRESS</code>&#39; 算法相比,ZSTD 提供了更优的速度和压缩比。</li><li>执行备份时使用指定的压缩算法</li></ul></li></ul>
<div class="jb51code"><pre class="brush:sql;">BACKUP DATABASE ... WITH COMPRESSION (ALGORITHM = ZSTD) -- 备份语句,指定压缩算法为 ZSTD</pre></div>
<ul><li>服务器范围的默认设置</li></ul>
<p>使用以下语句将 ZSTD 设置为所有备份的默认压缩算法:</p>
<div class="jb51code"><pre class="brush:sql;">-- 压缩算法取值:0 = MS_XPRESS(默认),1 = 无,2 = XPRESS,3 = ZSTD
EXEC sp_configure 'backup compression algorithm', 3; -- 配置备份压缩算法为 ZSTD
RECONFIGURE; -- 使配置生效</pre></div>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>内存优化(XTP)相关文件和文件组的移除</h3>
<p>现在可通过删除所有内存优化文件和文件组,完全移除内存优化OLTP的相关表和数据文件&mdash;&mdash; 这在早期版本中无法实现。</p>
<ul><li>验证步骤</li></ul>
<ul><li>使用&nbsp;<code>sys.dm_db_xtp_undeploy_status</code>检查是否使用了内存优化表(deployment_state = 1 或 2)。</li></ul>
<div class="jb51code"><pre class="brush:sql;">SELECT *
FROM sys.dm_db_xtp_undeploy_status;</pre></div>
<ul><li>删除所有内存优化表相关对象</li></ul>
<p>在移除数据文件之前,必须删除所有内存优化表、表类型和本机编译的存储过程。</p>
<ul><li>移除文件和文件组</li></ul>
<p>使用&nbsp;<code>ALTER DATABASE ... REMOVE FILE 和 ALTER DATABASE ... REMOVE FILEGROUP</code>来删除最后一个文件和文件组。</p>
<ul><li>长时间运行的移除过程</li></ul>
<p>如果移除停滞,执行&nbsp;<code>CHECKPOINT</code>&nbsp;命令并监控&nbsp;<code>sys.dm_db_xtp_undeploy_status</code>视图以跟踪进度并解决事务日志截断问题。</p>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>列存储索引的改进</h3>
<ul><li>有序非聚集列存储索引</li></ul>
<p>通过保持<strong>非聚集</strong>列存储索引数据的排序状态,提升了实时运营分析HTAP场景中的查询性能。适用于对运营数据频繁执行分析查询的场景。SQL Server 2022已经提供了有序<strong>聚集</strong>列存储索引功能。</p>
<ul><li>有序列存储索引的联机创建 / 重建</li></ul>
<p>现在可在<code>CREATE INDEX</code>或<code>ALTER INDEX</code>语句的ORDER子句中使用<code>ONLINE = ON</code>。即使是有序列存储索引,也能在索引创建或重建期间实现停机时间最小化。</p>
<ul><li>有序聚集列存储索引的排序质量改进</li></ul>
<p>在联机创建有序<strong>聚集</strong>列存储索引时,SQL Server 现在使用TempDB数据库进行排序,而非内存排序。若<code>MAXDOP = 1</code>,索引生成的列段将完全有序且无重叠,提升查询性能(通过列段消除)。虽然可能因TempDB数据库 的I/O 增加从而增加构建时间,但在多数场景下收益超过成本。</p>
<ul><li>收缩LOB页面的改进</li></ul>
<p>列存储索引使用LOB页面,<code>DBCC SHRINKDATABASE</code>和<code>DBCC SHRINKFILE</code>现在可移动列存储索引中的 LOB 数据页。这使得收缩操作在回收空间时更有效,此前版本中这一能力受限。</p>
<p class="maodian"><a name="_lab2_2_6"></a></p><h3>变更跟踪(change tracking)改进</h3>
<ul><li>新清理策略</li></ul>
<p>为大型变更跟踪辅助表引入自适应浅度清理。</p>
<p>以增量步骤运行,减少资源使用并提升可扩展性。</p>
<ul><li>默认启用</li></ul>
<p>在 SQL Server 2025 中,自适应浅度清理默认启用。</p>
<p>它取代了 SQL Server 2022 及更早版本中使用的旧深度清理方法。</p>
<p>若要禁用自适应浅度清理,请全局启用trace flag跟踪标志 8273。</p>
<ul><li>安全清理点</li></ul>
<p>清理基于由保留期和清理深度确定的安全点。</p>
<p>有助于避免大型表上的长时间阻塞操作。</p>
<ul><li>收益</li></ul>
<p>减少清理期间的 CPU 和 I/O 峰值。</p>
<p>对于具有大型变更跟踪辅助表的环境更高效。</p>
<p class="maodian"><a name="_lab2_2_7"></a></p><h3>AlwaysOn可读辅助副本的持久化统计信息</h3>
<ul><li>自动统计信息持久化</li></ul>
<p>可读辅助副本上创建的临时统计信息,现在会<strong>自动持久化到主副本</strong>。</p>
<p>一旦持久化,这些统计信息会在所有副本间同步,从而提升查询性能和一致性。</p>
<ul><li>无需跟踪标志</li></ul>
<p>与 SQL Server 2022(需要跟踪标志 12606)不同,该功能在 SQL Server 2025 中<strong>默认启用</strong>。 在 SQL Server 2025 中使用跟踪标志 12606 会<strong>禁用该功能</strong>。</p>
<ul><li>sys.stats 视图中的新字段</li></ul>
<ul><li><code>replica_role_id</code>&nbsp;指示副本角色(1 = 主副本,2 = 辅助副本,依此类推)。</li><li><code>replica_role_desc</code>&nbsp;描述副本角色。</li><li><code>replica_name</code>&nbsp;创建统计信息的副本名称。</li></ul>
<ul><li>功能亮点</li></ul>
<ul><li>即使完成持久化,临时统计信息仍会保留在辅助副本上。</li><li>优化器会使用最佳可用的统计信息,无论其来源。</li><li>辅助副本仍可基于自身的数据视图刷新过期统计信息。</li></ul>
<ul><li>监控与故障排除</li></ul>
<ul><li>使用扩展事件(<code>persisted_stats_operation</code>)监控持久化操作。</li><li>常见错误消息包括:<ul><li>9131:功能已禁用</li><li>9136:表/索引已删除</li><li>9139:统计信息过大无法发送</li></ul></li></ul>
<p class="maodian"><a name="_lab2_2_8"></a></p><h3>对TempDB数据库启用加速数据库恢复</h3>
<p>现在可以对TempDB数据库启用加速数据库恢复功能</p>
<p class="maodian"><a name="_lab2_2_9"></a></p><h3>收益</h3>
<ul><li>事务<strong>即时回滚</strong></li><li>主动事务日志截断</li><li>有助于防止长时间事务回滚和 TempDB 事务日志空间耗尽(这类情况可能导致数据库停机)</li></ul>
<p class="maodian"><a name="_lab2_2_10"></a></p><h3>重要性</h3>
<p>在早期版本中,即使采用最小日志记录,TempDB 中长时间运行或失败的事务(例如涉及临时表或表变量的事务)也可能会导致:</p>
<ul><li>事务日志<strong>高使用率</strong></li><li>事务回滚<strong>延迟</strong></li><li>应用程序<strong>中断</strong></li></ul>
<p class="maodian"><a name="_lab2_2_11"></a></p><h3>示例代码</h3>
<div class="jb51code"><pre class="brush:sql;">-- 启用 tempdb 的加速数据库恢复
ALTER DATABASE
SET ACCELERATED_DATABASE_RECOVERY = ON;
-- 验证 tempdb数据库是否启用了加速数据库恢复(ADR)
SELECT name,
       is_accelerated_database_recovery_on
FROM sys.databases
WHERE name = 'tempdb';</pre></div>
<p class="maodian"><a name="_lab2_2_12"></a></p><h3>TempDB数据库空间资源治理</h3>
<ul><li>背景</li></ul>
<p>防止失控查询或工作负载消耗过多的 tempdb数据库空间。</p>
<p>通过实施每个工作负载的限制,帮助提高可靠性并避免中断。</p>
<ul><li>设置方式</li></ul>
<p>可以按工作负载组设置 tempdb 空间限制,方式如下:</p>
<div class="jb51code"><pre class="brush:sql;">GROUP_MAX_TEMPDB_DATA_MB -- 以 MB 为单位的固定大小。
GROUP_MAX_TEMPDB_DATA_PERCENT -- 占 tempdb 总大小的百分比。
-- 若两者都设置,固定限制优先。</pre></div>
<ul><li>监控资源使用</li></ul>
<p><code>sys.resource_governor_workload_groups</code>视图显示已配置的限制</p>
<p><code>sys.dm_resource_governor_workload_groups</code>视图显示当前和峰值的 tempdb 使用率</p>
<p>扩展事件:<code>tempdb_data_workload_group_limit_reached</code>&nbsp;当某个工作负载组超出其限制时触发</p>
<ul><li>最佳实践</li></ul>
<p>避免将限制设置得过低,尤其是默认工作负载组。</p>
<p>如果工作负载不太可能同时达到峰值,可在多个组之间超额配置限制(例如,总限制超过 tempdb 的 100%)。</p>
<p>预先设置好tempdb 数据文件大小和增长大小,并正确配置&nbsp;<code>MAXSIZE</code>&nbsp;和&nbsp;<code>FILEGROWTH</code>,以使用基于百分比的限制。</p>
<ul><li>限制</li></ul>
<p>仅适用于tempdb数据文件,不适用于事务日志文件。</p>
<p>版本存储的使用(例如,用于加速数据库恢复(ADR)的部分)不受治理。</p>
<p>空间按 8 KB 页跟踪,即使是部分使用的页也会被跟踪。</p>
<ul><li>示例代码</li></ul>
<p>配置 tempdb 空间资源调控器</p>
<div class="jb51code"><pre class="brush:sql;">-- 启用资源调控器
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;</pre></div>
<p>监控 tempdb 使用率</p>
<div class="jb51code"><pre class="brush:sql;">-- 监控 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;</pre></div>
<p>使用扩展事件监控限制违规</p>
<div class="jb51code"><pre class="brush:sql;">-- 使用扩展事件监控限制违规
CREATE EVENT SESSION 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</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>优化锁定</h2>
<p class="maodian"><a name="_lab2_3_13"></a></p><h3>什么是优化锁定</h3>
<ul><li>一种新的锁定机制,可减少锁内存使用、最小化阻塞并避免锁升级。</li><li>旨在为高吞吐量事务工作负载提升并发性和性能。</li></ul>
<p class="maodian"><a name="_lab2_3_14"></a></p><h3>核心组成</h3>
<ul><li><strong>事务ID锁</strong></li></ul>
<ul><li>每一行的最后存储修改它的<code>事务ID</code>。</li><li>不再持有大量行/页锁,而是持有一个单独的<code>TID</code>锁,直到事务结束。</li><li>行/页锁在修改后立即释放。</li></ul>
<ul><li><strong>限定后锁定</strong></li></ul>
<ul><li>使用最新提交的行版本评估谓词,而不获取锁。</li><li>仅在某行符合修改条件后才获取锁。</li><li>减少阻塞并提升并发性。</li></ul>
<p class="maodian"><a name="_lab2_3_15"></a></p><h3>功能可用</h3>
<table><tbody><tr><th>平台</th><th>可用</th><th>默认启用</th></tr><tr><td>SQL Server 2025 (17.x)</td><td>✔️</td><td>❌</td></tr><tr><td>Azure SQL 数据库</td><td>✔️</td><td>✔️</td></tr><tr><td>Microsoft Fabric 中的 SQL 数据库</td><td>✔️</td><td>✔️</td></tr><tr><td>Azure SQL 托管实例(AUTD)</td><td>✔️</td><td>✔️</td></tr><tr><td>SQL Server 2022 及更早版本</td><td>❌</td><td>❌</td></tr></tbody></table>
<p class="maodian"><a name="_lab2_3_16"></a></p><h3>启用优化锁定</h3>
<p>示例代码</p>
<div class="jb51code"><pre class="brush:sql;">ALTER DATABASE SET OPTIMIZED_LOCKING = ON;</pre></div>
<p class="maodian"><a name="_lab2_3_17"></a></p><h3>前提条件</h3>
<ul><li>数据库必须已经启用了<strong>加速数据库恢复(ADR)</strong>。</li><li>为了充分获得<strong>限定后锁定(LAQ)</strong>的优势,数据库应打开<strong>读已提交快照(RCSI)</strong>隔离级别</li></ul>
<div class="jb51code"><pre class="brush:sql;">ALTER DATABASE [你的数据库名] SET READ_COMMITTED_SNAPSHOT ON;</pre></div>
<p class="maodian"><a name="_lab2_3_18"></a></p><h3>监控</h3>
<p>开启了优化锁定之后,使用下面手段监控锁的情况</p>
<ul><li>使用&nbsp;<code>sys.dm_tran_locks</code>&nbsp;视图观察锁行为。</li><li>新增的等待类型:<code>LCK_M_S_XACT_READ</code>、<code>LCK_M_S_XACT_MODIFY</code>。</li><li>扩展事件&nbsp;<code>lock_after_qual_stmt_abort</code>&nbsp;当 LAQ(限定后锁定)被中止并重试时触发。</li><li>扩展事件&nbsp;<code>locking_stats</code>&nbsp;锁使用情况和 LAQ/TID 活动的定期汇总。</li></ul>
頁: [1]
查看完整版本: SQL Server 2025数据库引擎新特性汇总