Oracle11gr2的PLSQL優化NULL語句

yangtingkun發表於2010-05-20

文件沒有提到這個特性,是測試的時候無意間發現的。

 

 

11gr2中,NULL語句似乎被Oracle忽略掉:

SQL> SELECT * FROM V$VERSION;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> SET TIMING ON
SQL> BEGIN
  2  FOR I IN 1..10000 LOOP
  3  FOR J IN 1..10000 LOOP
  4  NULL;
  5  END LOOP;
  6  END LOOP;
  7  END;
  8  /

PL/SQL 過程已成功完成。

已用時間:  00: 00: 00.12
SQL> BEGIN
  2  FOR I IN 1..100000000 LOOP
  3  FOR J IN 1..100000000 LOOP
  4  NULL;
  5  END LOOP;
  6  END LOOP;
  7  END;
  8  /

PL/SQL 過程已成功完成。

已用時間:  00: 00: 00.03

從執行時間上判斷,Oracle根本就沒有執行迴圈和NULL語句,這個特性應該是11G才有的,11G以前Oracle會執行迴圈操作的:

SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit
Production
PL/SQL Release 9.2.0.4.0 - Production
CORE    9.2.0.3.0       Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production

SQL> SET TIMING ON
SQL> BEGIN
  2  FOR I IN 1..10000 LOOP
  3  FOR J IN 1..10000 LOOP
  4  NULL;
  5  END LOOP;
  6  END LOOP;
  7  END;
  8  /

PL/SQL 過程已成功完成。

已用時間:  00: 00: 04.52
SQL> BEGIN
  2  FOR I IN 1..100000 LOOP
  3  FOR J IN 1..10000 LOOP
  4  NULL;
  5  END LOOP;
  6  END LOOP;
  7  END;
  8  /

PL/SQL 過程已成功完成。

已用時間:  00: 00: 44.94

同樣的語句在9i中迴圈顯然是起作用的。

顯然9i10g中利用迴圈和NULL語句使得Oracle執行一段時間的方法在11gr2中已經行不通了。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-663280/,如需轉載,請註明出處,否則將追究法律責任。

相關文章