是的,如果您:
- 正在运行SQL Server 2014或更高版本;和
- 能够在跟踪标记176处于活动状态的情况下运行查询;和
- 计算列是
PERSISTED
具体来说,至少需要以下版本:
- SQL Server 2016 SP1的累积更新2
- SQL Server 2016 RTM的累积更新4
- SQL Server 2014 SP2的累积更新6
但为了避免错误(用于REF 2014,以及2016和2017年),在这些补丁推出,而是适用于:
使用,跟踪标记–T
在全局和会话范围内均有效,可作为启动选项DBCC TRACEON
,并且每个查询使用OPTION (QUERYTRACEON)
或计划指南。
跟踪标记176防止持久的计算列扩展。
编译查询时执行的初始元数据加载会引入所有列,而不仅仅是直接引用的那些列。这使得所有计算的列定义都可用于匹配,这通常是一件好事。
作为不幸的副作用,如果已加载(计算的)列之一使用标量用户定义函数,则即使实际未使用计算列,其存在也会对整个查询禁用并行性。
如果该列被保留,则跟踪标志176通过不加载定义(因为扩展被跳过)而对此有所帮助。这样,标量用户定义函数永远不会出现在编译查询树中,因此不会禁用并行性。
跟踪标志176的主要缺点(除了仅作简单记录外)还阻止查询表达式与持久化的计算列匹配:如果查询包含与持久化的计算列匹配的表达式,跟踪标志176将阻止表达式替换为对计算列的引用。
有关更多详细信息,请参见我的SQLPerformance.com文章“ 正确地保留计算列”。
由于问题提到XML,作为使用计算列和标量函数提升值的替代方法,因此您也可以考虑使用Selective XML Index,如您在Selective XML Indexes:All Bad All中所写。