我在表 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。我可以修复它,为函数头添加确定性,但我曾经认为访问表数据的每个函数/存储过程都是非确定性的。
这个问题的正确解决方案是什么?