Oracle数据库中WHERE子句内常量参数函数的调用次数咨询
Oracle中myfunction(12324)的调用次数分析
1. 未标记为确定性函数(DETERMINISTIC)的情况
默认情况下,Oracle会对每一行需要检查WHERE条件的数据调用一次该函数。因为Oracle无法确定这个函数在相同输入下是否返回固定结果,所以会在过滤table1与table2连接后的每一行数据时,都执行一次myfunction(12324),再将结果与table1.id对比。
调用次数取决于执行计划中需要检查的行数——比如如果table1和table2连接后有1000行数据,函数就会被调用1000次。
2. 标记为确定性函数(DETERMINISTIC)的情况
如果函数定义时添加了DETERMINISTIC关键字,Oracle会明确知道:相同的输入参数必然返回相同的结果。此时Oracle会仅调用函数一次,将结果缓存后,用缓存值与所有符合条件的行进行对比。
示例函数定义
普通函数:
CREATE OR REPLACE FUNCTION myfunction(p_num NUMBER) RETURN NUMBER IS BEGIN DBMS_OUTPUT.PUT_LINE('函数已调用'); RETURN p_num + 1; END; /
确定性函数:
CREATE OR REPLACE FUNCTION myfunction(p_num NUMBER) RETURN NUMBER DETERMINISTIC IS BEGIN DBMS_OUTPUT.PUT_LINE('函数已调用'); RETURN p_num + 1; END; /
验证方法
开启DBMS_OUTPUT后执行目标查询,观察输出的"函数已调用"次数,即可直观看到两种情况的差异。
补充说明
少数场景下,即使函数未标记DETERMINISTIC,Oracle优化器可能基于统计信息或执行计划选择(比如先计算函数值再过滤),只调用一次函数,但这种行为是不稳定的,无法保证。只有显式标记DETERMINISTIC,才能确保函数仅被调用一次。
内容的提问来源于stack exchange,提问作者Martin T
相关产品推荐
相关产品推荐

