Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL:表中的持久化计算字段有时在查询执行期间不使用_Sql Server_Sql Server 2008 - Fatal编程技术网

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数据类型、不精确/浮点表达式),不需要将它们持久化以进行索引。谢谢您纠正了我的无知。反思。。。