Oracle Assignment vs Select Into

时间:2013-12-27 15:50:04

标签: sql performance oracle

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

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

1) :new.a := upper(:new.a);
2) select upper(:new.a) into :new.a from dual;

我没有找到任何效果信息herehere,虽然这些是使用文档,所以我可能找错了地方。我确实在第二个上运行了一个解释计划,但是无法弄清楚如何让第一个工作。

3 个答案:

答案 0 :(得分: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>



300毫秒与6秒===> 快20倍

答案 1 :(得分:6)

Tom Kyte says

  

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

select f(x) into l_x from dual; 
     

结束

l_x := f(x); 
     

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

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

尽管如此,使用select肯定没有任何好处。

答案 2 :(得分:3)

选项#1 使用PL / SQL引擎本身完成。结果立即可用。更多内置功能,非常快!

选项#2 一个上下文切换从PL / SQL引擎切换到SQL引擎

两者都很快。但是为什么要浪费SQL上下文切换?(当多次调用时...多次交换)这是一个可以忽略的,但仍然。 选项#1 赢得胜利!