0

我在表 Entity 和 Contact 之间有 1:1 的关系(对应于 object 的继承)。fn_match(id) 是 UDF,它返回布尔值,如果记录匹配某些特殊条件(函数内的其他查询)则返回 true。这是一个查询:

select *
from Entity a
inner join Contact b on a.id = b.id
where fn_match(a.i)

它工作得很好,但加入会极大地破坏性能。我添加了日志记录,发现对于实体中的每条记录,fn_match 被调用了两次,其中 fn_match(id) = true。我可以修复它,为函数头添加确定性,但我曾经认为访问表数据的每个函数/存储过程都是非确定性的。

这个问题的正确解决方案是什么?

4

1 回答 1

0

您可以使用临时表来存储FROM Entity WHERE fn_match(i)- 的结果,但这可能不会提高性能。如果 fn_match 被调用两次会破坏性能,那么如果对 Entity 中的每个项目只调用一次,性能似乎就不会那么好 - 所以可能更好地重新考虑这个函数。

于 2010-08-30T17:33:40.967 回答