我知道这是微观优化 - 这更像是好奇心的问题。
我很好奇,下面两个选项更快:
1) :new.a := upper(:new.a);
2) select upper(:new.a) into :new.a from dual;
我没有找到任何效果信息here或here,虽然这些是使用文档,所以我可能找错了地方。我确实在第二个上运行了一个解释计划,但是无法弄清楚如何让第一个工作。
答案 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)
我不知道为什么有人想要编码:
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 赢得胜利!