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)
我没有在这里或这里找到任何性能信息,虽然那些是使用文档,所以我可能在错误的地方寻找.我确实在第二次运行解释计划,但无法弄清楚如何让第一个工作.
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 倍快
我不知道为什么有人会想要编码:
Run Code Online (Sandbox Code Playgroud)select f(x) into l_x from dual;过度
Run Code Online (Sandbox Code Playgroud)l_x := f(x);它只是"愚蠢"(它必须来自T-SQL和Sqlserver/Sybase编码器,他们必须这样做)
我意识到它并没有完全解决你的问题.您将在第二个版本中进行上下文切换,但我认为除非在极端条件下,例如在非常紧凑的循环中,效果可以忽略不计.我有一个模糊的记忆,当它被认为是不必要的时候,从PL/SQL调用中优化出来的选择是优化的,但是我找不到任何支持它的东西,所以我可能已经想到了它.(并且kordirko的测试表明我做了!)
但是,使用select该作业肯定没有任何好处.