2010-08-30 84 views
0

我在表Entity和Contact(对应于对象的不可靠)之间有1:1的关系。 fn_match(id)是返回布尔值的UDF,如果记录匹配某些特殊条件(函数内的附加查询),则返回true。这是一个查询:用户定义函数的mysql查询 - 为什么函数被调用两次?

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

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

+0

我同意每个记录的调用函数都不利于性能。我无法解释所有细节,但我真的被迫实施这种方式。 – burnall 2010-08-30 19:35:26