我在表中添加了一个持久计算列。
ALTER TABLE guest
ADD FullName AS
dbo.complicatedFunction(ISNULL(FirstName, N'') + ISNULL(LastName, '')) PERSISTED
GO
我还在该字段上添加了非聚集索引。
当我从该表中选择并将该列包含在where语句中时,执行它需要很长时间。
我尝试直接用表达式替换持久化列,并且执行需要相同的时间,这使我相信当我尝试从该表中选择某些内容时,每行都会重新计算FullName字段。
如何避免重新计算并让查询使用索引?
答案 0 :(得分:0)
原因是查询优化器没有做得很好 花费用户定义的功能。在某些情况下,它决定它 完全重新评估每一行的功能会更便宜, 而不是招致可能必要的磁盘读取。
答案 1 :(得分:0)
马丁·史密斯发布了一个关于为什么会发生这种情况的重要解释的链接,在阅读完之后,我用它的身体替换了对UDF的调用,它解决了我的问题。