Sql server SQL:表中的持久化计算字段有时在查询执行期间不使用
可能重复:Sql server SQL:表中的持久化计算字段有时在查询执行期间不使用,sql-server,sql-server-2008,Sql Server,Sql Server 2008,可能重复: 在SQLServer2008中,我在一个长时间运行的查询上运行SQL事件探查器,可以看到一个持久化的计算列正在被重复地重新计算。我以前注意到过这一点,而且我会说,这似乎发生在更复杂的查询和/或至少有几千行的表上 这种重新计算肯定是执行时间长的原因,因为如果我从返回的结果中注释掉其中一列(该字段是通过对Xml字段运行XPath计算的),它会显著加快执行速度 编辑:有问题的SQL具有以下结构: DECLARE @OrderBy nvarchar(50); SELECT A.[
在SQLServer2008中,我在一个长时间运行的查询上运行SQL事件探查器,可以看到一个持久化的计算列正在被重复地重新计算。我以前注意到过这一点,而且我会说,这似乎发生在更复杂的查询和/或至少有几千行的表上 这种重新计算肯定是执行时间长的原因,因为如果我从返回的结果中注释掉其中一列(该字段是通过对Xml字段运行XPath计算的),它会显著加快执行速度 编辑:有问题的SQL具有以下结构:
DECLARE @OrderBy nvarchar(50);
SELECT
A.[Id],
CASE
WHEN @OrderBy = 'Col1' THEN A.[ComputedCol1]
WHEN @OrderBy = 'Col2' THEN C.[ComputedCol2]
ELSE C.[ComputedCol3]
END AS [Order]
FROM
[Stuff] AS A
INNER JOIN
[StuffCode] AS SC
ON
A.[Code] = SC.[Code]
除了ComputedCol3是nvarchar(250)之外,所有列都是nvarchar(50)。查询优化器总是尝试选择最便宜的计划,但可能没有做出正确的选择。通过持久化列,可以将其放入主表(在聚集索引或堆中),但为了提取这些值,仍然需要正常的数据访问路径 这意味着引擎可以选择其他索引而不是主表来满足查询,如果它认为重新计算计算列与选择的I/O访问模式相结合的成本更低,则可以选择重新计算计算列。一般来说,相当数量的CPU比少量I/O便宜,但没有对表达式的成本进行内部分析,因此,如果您的列调用昂贵的UDF,它可能会做出错误的决定 在列上添加索引可能会有所不同。请注意,您不必使列持久化以在其上放置索引。如果在创建索引后,引擎仍在出错,请检查是否收集了正确的统计信息,并经常更新表中的所有索引 如果您发布了表的结构(只是重要的列)和任何索引的定义,以及当情况不好时执行计划的一些想法,这将对我们有所帮助
需要考虑的是,在某些情况下,重新计算列实际上可能更好。因此,在执行此操作之前,请确保强制引擎获取XML列是正确的。该查询是否也有可能操纵XML列?否。有关详细信息,请参阅相关的其他示例查询。@Martin您的链接指向的是答案,而不是question@finnw-由于某种原因,自动生成的评论没有出现,因此我不得不手动创建一个。那一定是把事情搞砸了!这是与答案相对应的问题。计算列可以被持久化而不被索引。真的吗?!不在SQL Server中。不过,我愿意被证明是错的。请做!只需在列定义中添加
持久化的
关键字。它将保存在数据页中。您也可以对这些进行索引,但除了在某些情况下(CLR数据类型、不精确/浮点表达式),不需要将它们持久化以进行索引。谢谢您纠正了我的无知。反思。。。