在select期间重新计算持久计算字段

时间:2012-06-22 11:10:45

标签: sql sql-server sql-server-2008

  

可能重复:
  Why does the Execution Plan include a user-defined function call for a computed column that is persisted?

我在表中添加了一个持久计算列。

ALTER TABLE guest
  ADD FullName AS
  dbo.complicatedFunction(ISNULL(FirstName, N'') + ISNULL(LastName, '')) PERSISTED
GO

我还在该字段上添加了非聚集索引。

当我从该表中选择并将该列包含在where语句中时,执行它需要很长时间。

我尝试直接用表达式替换持久化列,并且执行需要相同的时间,这使我相信当我尝试从该表中选择某些内容时,每行都会重新计算FullName字段。

如何避免重新计算并让查询使用索引?

Execution plan

2 个答案:

答案 0 :(得分:0)

  

原因是查询优化器没有做得很好   花费用户定义的功能。在某些情况下,它决定它   完全重新评估每一行的功能会更便宜,   而不是招致可能必要的磁盘读取。

Why does the Execution Plan include a user-defined function call for a computed column that is persisted?

答案 1 :(得分:0)

马丁·史密斯发布了一个关于为什么会发生这种情况的重要解释的链接,在阅读完之后,我用它的身体替换了对UDF的调用,它解决了我的问题。