You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 17:56:06