Oracle Assignment vs Select Into

Tra*_*vis 5 sql oracle performance

我知道这是微观优化 - 这更像是好奇心的问题.

我很好奇,下面两个选项更快:

1) :new.a := upper(:new.a);
2) select upper(:new.a) into :new.a from dual;
Run Code Online (Sandbox Code Playgroud)

我没有在这里这里找到任何性能信息,虽然那些是使用文档,所以我可能在错误的地方寻找.我确实在第二次运行解释计划,但无法弄清楚如何让第一个工作.

kro*_*lko 7

SQL> set timing on
SQL> DECLARE
  2    i number;
  3  BEGIN
  4    FOR j IN 1..100000 LOOP
  5      i:=i+j;
  6    END LOOP;
  7  END;
  8  /

Procedura PL/SQL zosta-a zako?czona pomy?lnie.

Ca-kowity: 00:00:00.03
SQL> DECLARE
  2    i number;
  3  BEGIN
  4    FOR j IN 1..100000 LOOP
  5      SELECT i+j INTO i FROM dual;
  6    END LOOP;
  7  END;
  8  /

Procedura PL/SQL zosta-a zako?czona pomy?lnie.

Ca-kowity: 00:00:05.98
SQL>
Run Code Online (Sandbox Code Playgroud)



300毫秒vs. 6秒===>〜20 倍快

  • 缓慢,上下文切换和不需要的SQL调用的原因.值得注意的根本原因.! (5认同)

Ale*_*ole 6

汤姆基特说:

我不知道为什么有人会想要编码:

select f(x) into l_x from dual; 
Run Code Online (Sandbox Code Playgroud)

过度

l_x := f(x); 
Run Code Online (Sandbox Code Playgroud)

它只是"愚蠢"(它必须来自T-SQL和Sqlserver/Sybase编码器,他们必须这样做)

我意识到它并没有完全解决你的问题.您将在第二个版本中进行上下文切换,但我认为除非在极端条件下,例如在非常紧凑的循环中,效果可以忽略不计.我有一个模糊的记忆,当它被认为是不必要的时候,从PL/SQL调用中优化出来的选择是优化的,但是我找不到任何支持它的东西,所以我可能已经想到了它.(并且kordirko的测试表明我做了!)

但是,使用select该作业肯定没有任何好处.