暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 非确定性函数和标量子查询缓存

ASKTOM 2019-03-20
340

问题描述

嗨,

我有一个关于标量子查询的问题:

为什么Oracle不将标量-子查询-缓存限制为被声明为确定性的函数?

使用确定性关键字,开发人员指出函数是确定性的。在我看来,其他所有功能都需要假定为潜在的不确定性。


目前标量子查询可能很容易导致错误的结果,我想知道为什么它是这样构建的。当然,可以说专家应该知道这些细节,但这有点违反直觉-不是吗?我敢打赌,超过一半的开发人员 (了解标量-子查询) 不知道这种陷阱。

我希望对此发表简短的意见。提前非常感谢。

亲切的问候

专家解答

你提出了一个很好的论点,但我认为 (这是我的意见,不是任何Oracle官方立场),我们的工作基础是,绝大多数函数将是确定性的,即使没有明确定义。

最终,我们必须相信开发人员对他们正在做的事情有合理的理解。即使撇开标量子查询,我也经常在SQL中看到很多函数调用,其中该函数引用了sysdate或systimetamp,从代码中可以相对明显地看出,开发人员假设这些将在整个查询过程中被固定...

SQL> create or replace
  2  function f(i varchar2) return varchar2 is
  3  begin
  4    return i||'-'||to_char(systimestamp,'HH24MISS:FF');
  5    dbms_lock.sleep(0.5);
  6  end;
  7  /

Function created.

SQL>
SQL> select rownum, f(rownum) x
  2  from   dual
  3  connect by level <= 10;

    ROWNUM X
---------- ------------------------------
         1 1-165100:802000000
         2 2-165100:863000000
         3 3-165100:863000000
         4 4-165100:897000000
         5 5-165100:897000000
         6 6-165100:930000000
         7 7-165100:930000000
         8 8-165100:964000000
         9 9-165100:964000000
        10 10-165100:997000000

10 rows selected.

复制


我们将继续尽最大努力教育开发人员数据正确性的重要性。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论