用户定义函数的Mysql查询 - 为什么函数被调用了两次?

时间:2010-08-30 17:29:59

标签: mysql optimization user-defined-functions deterministic

表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。我可以修复它向函数头添加确定性,但我曾经认为访问表数据的每个函数/存储过程都是非确定性的。

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

1 个答案:

答案 0 :(得分:0)

您可以使用临时表来存储FROM Entity WHERE fn_match(i)的结果 - 但这可能无法提高性能。如果它在两次调用fn_match的情况下破坏了性能,那么如果对于Entity中的每个项只调用一次性能,那么性能似乎不会那么好 - 所以最好重新考虑一下这个函数。