0

可能重复:
为什么执行计划包含一个用户定义的函数调用,用于持久化计算列?

我已将持久计算列添加到表中。

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

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

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

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

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

执行计划

4

2 回答 2

0

原因是查询优化器在计算用户定义函数的成本方面做得不是很好。在某些情况下,它决定完全重新评估每一行的函数会更便宜,而不是导致可能需要的磁盘读取。

为什么执行计划包含一个用户定义的函数调用,用于持久化计算列?

于 2012-07-01T21:03:09.660 回答
0

Martin Smith 发布了一个链接,该链接很好地解释了为什么会发生这种情况,在阅读完之后,我用它的主体替换了对 UDF 的调用,它解决了我的问题。

于 2012-07-02T07:51:25.423 回答