

# 在 RDS for Microsoft SQL Server 中设置跟踪标志
<a name="Appendix.SQLServer.CommonDBATasks.TraceFlags"></a>

SQL Server 跟踪标志是一种可以打开或关闭的设置，用于更改数据库引擎的行为方式。您可以使用跟踪标志来启用隐藏功能、修复性能问题或者覆盖默认的服务器行为。实际上，每个跟踪标志都充当打开/关闭开关，用于更改 SQL Server 的默认行为。

有关 Microsoft SQL Server 中可用跟踪标志的完整列表，请参阅 Microsoft 文档中的 [DBCC TRACEON - Trace Flags](https://learn.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql?view=sql-server-ver17#trace-flags)。

作为一项托管式服务，RDS for SQL Server 会限制全局服务器级设置。您只能通过 RDS for SQL Server [数据库参数组](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/parameter-groups-overview.html)将特定的跟踪标志配置为启动参数。下表列出了 RDS for SQL Server 中支持的跟踪标志。

**重要**  
我们强烈建议您在生产环境中启用跟踪标志之前，进行全面的测试和验证。跟踪标志对于性能调整和故障排除非常有用，但如果错误使用，可能会导致不稳定、查询计划欠佳或资源问题。


| 跟踪标志 | 说明 | 
| --- | --- | 
| 647 | 跳过 SQL Server 2012 中引入的数据验证检查，该检查可能导致 `ALTER TABLE... ADD` 列操作的运行速度明显变慢。 | 
| 652 | 禁用扫描时的页面预提取。启用后，SQL Server 将停止提前将页面加载到缓冲池中。这可能会降低依赖预提取的查询的性能。 | 
| 692 | 禁用将数据批量加载到堆或聚集索引时的快速插入功能（SQL Server 2016 及更高版本支持）。 | 
| 1204 | 返回参与死锁的资源和锁类型以及受影响的当前命令。 | 
| 1211 | 根据内存压力或锁数量禁用锁定升级。SQL Server 不会将行锁或页锁升级为表锁。 | 
| 1222 | 以 XML 格式返回死锁信息（1204 的增强版）。 | 
| 1224 | 根据锁数量禁用锁定升级（内存压力仍可激活锁定升级）。 | 
| 1448 | 允许复制日志读取器无需等待异步辅助读取器确认更改即可向前推进。日志读取器仍会等待处于 `SYNCHRONIZED` 状态的同步辅助读取器。它不会超出其确认的最低日志序列号（LSN）。 | 
| 2528 | 禁用 `DBCC CHECKDB`、`DBCC CHECKFILEGROUP` 和 `DBCC CHECKTABLE` 对对象的并行检查。 | 
| 3654 | 用于对内存泄漏或未释放的内存情况进行故障排除。处于活动状态时，如果检测到此类问题，SQL Server 会触发断言失败并生成小型转储。转储是由增强跟踪捕获的底层内存错误引起的，而非跟踪标志本身引起的。 | 
| 4138 | 对使用 `TOP`、`OPTION (FAST N)`、`IN` 或 `EXISTS` 的查询禁用行目标调整。这会强制 SQL Server 在不进行行目标优化的情况下生成完整的计划。 | 
| 4139 | 无论前导列是升序、降序还是平稳，都会在查询编译时调整直方图，以更好地估计基数。 | 
| 4199 | 控制先前在多个跟踪标志下进行的多项查询优化器更改。 | 
| 4616 | 使服务器级别的元数据对应用程序角色可见。 | 
| 6527 | 在公共语言运行时（CLR）集成中首次出现内存不足异常时，禁止生成内存转储。 | 
| 7745 | 禁止查询存储在数据库关闭期间将数据刷新到磁盘。 | 
| 8285 | 修复了启用更改数据捕获（CDC）或读取提交快照隔离（RCSI）的数据库中的断言错误 (`IndexRowScanner.cpp: m_versionStatus.IsVisible()`)。它通过将断言转换为受控错误消息（SQL Server 2022 累积更新（CU）6 或更高版本）或抑制它们（SQL Server 2019）来防止堆栈转储。 | 
| 8780 | 让优化器有更多时间来寻找更好的计划。 | 
| 9432 | 禁用 SQL Server 2019 CU14 中的修复程序，该修复程序更正了使用 `SESSION_CONTEXT` 的并行计划中的错误结果。与跟踪标志 11042 一起使用，以防止在重置会话以供重复使用时出现访问冲突转储。 | 
| 9481 | 强制查询优化器使用旧版基数估计模型（SQL Server 2012 及更早版本），而不考虑数据库兼容性级别。替代方案：在数据库级别，使用 `ALTER DATABASE SCOPED CONFIGURATION`；在查询级别，使用 `QUERYTRACEON` 查询提示。 | 
| 9492 | 在实例级别禁止并行执行 `SELECT INTO`（批量插入）操作，以减少 `LATCH_EX` 对 `METADATA_SEQUENCE_GENERATOR` 的等待。可能会稍微降低性能，但会提高整体稳定性。 | 
| 9592 | 为同步可用性组启用日志流压缩。默认情况下，同步可用性组上的日志流压缩处于禁用状态，因为压缩会增加延迟。启用此功能可减少副本之间的网络带宽使用量，但代价是额外增加 CPU 开销和一定的延迟。适用于：SQL Server 2016（13.0）及更高版本。 | 
| 11024 | 在 SQL Server 2017 中，分区表上增量统计信息的自动更新可能会延迟。出现这种情况的原因是：如果没有任何单个分区超过其本地阈值，即使合并计数超过根阈值，根节点的修改计数也会重置为零。跟踪标志 11024 通过将根节点的修改计数保持为所有分区修改的真实总和来解决此问题，从而确保统计信息得到及时更新。适用于：SQL Server 2017 CU3 及更高版本。 | 
| 11042 | SQL Server 2019 CU14 修复了使用 `SESSION_CONTEXT` 的并行计划中出现错误结果的问题。但是，当重置会话以供重复使用时，此修复可能会导致访问冲突转储。解决方法：同时启用以下两个跟踪标志：跟踪标志 11042（禁止并行执行 `SESSION_CONTEXT`）和跟踪标志 9432（禁用原始 CU14 修复程序）。注意：这个已知问题在最新的 SQL Server 版本中仍然存在。Microsoft 将在未来的 CU 中提供永久修复程序。 | 
| 12502 | 通过禁用本地 SQL Server 实例的外部授权策略，修复 `PREEMPTIVE_OS_QUERYREGISTRY` 等待时间过长的问题。适用于：SQL Server 2022 CU5\+。 | 
| 12618 | 允许自动更正计划（APC）功能对同一计划执行多次连续的回归检查，从而在决定是否更正之前收集更多统计数据。适用于：SQL Server 2022 CU4 及更高版本。 | 
| 12656 | 在自动更正计划（APC）功能检测到计划变更后，延迟 5 分钟再运行回归检查。这样可以避免因快速运行的查询导致结果出现偏差，同时兼顾受该变更影响的长时间运行或容易超时的查询。适用于：SQL Server 2022 CU4\+。 | 

**注意**  
从 SQL Server 2016 Service Pack 1（SP1）及更高版本开始，我们建议您在查询级别使用 `USE HINT` 查询提示，而不是跟踪标志 4138 和 4139。在生产环境中应用此更改之前，请务必进行彻底的测试。

**重要**  
使用跟踪标志 7745 时，未刷新的查询存储数据可能会在关闭期间丢失。要立即关闭 SQL Server，请使用 `SHUTDOWN WITH NOWAIT` 而不是此跟踪标志。