表Entity和Contact之间有1:1的关系(对应于对象的继承)。 fn_match(id)是UDF,它返回boolean,如果record匹配某些特殊条件(函数内的其他查询),则返回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。我可以修复它向函数头添加确定性,但我曾经认为访问表数据的每个函数/存储过程都是非确定性的。
这个问题的正确解决方案是什么?
答案 0 :(得分:0)
您可以使用临时表来存储FROM Entity WHERE fn_match(i)
的结果 - 但这可能无法提高性能。如果它在两次调用fn_match的情况下破坏了性能,那么如果对于Entity中的每个项只调用一次性能,那么性能似乎不会那么好 - 所以最好重新考虑一下这个函数。