天天看點

Bulk Binds對性能的提高

    當Oracle運作PL/SQL時會使用兩套引擎,所有procedural code由PL/SQL engine 完成,所有SQL由SQL engine處理。是以如果Oracle從一個collection中循環執行相同的DML操作,那麼為了避免兩套engine切換所消耗的系統資源,可以使用bulk binds來把所有的DML操作binding到一次操作中完成。這将極大提高PL/SQL的執行效率。

 以下是簡單的測試,用兩種方式插入100000條資料,可以看到效率提高了7倍左右。

SQL> CREATE TABLE test1( 

    2        id                     NUMBER(10), 

    3        description    VARCHAR2(50)); 

Table created 

SQL> ALTER TABLE test1 ADD ( 

    2        CONSTRAINT test1_pk PRIMARY KEY (id)); 

Table altered 

SQL> SET TIMING ON; 

SQL> DECLARE 

    2        TYPE id_type                    IS TABLE OF test1.id%TYPE; 

    3        TYPE description_type IS TABLE OF test1.description%TYPE; 

    4 

    5        t_id                     id_type                    := id_type(); 

    6        t_description    description_type := description_type(); 

    7    BEGIN 

    8        FOR i IN 1 .. 100000 LOOP 

    9            t_id.extend; 

10            t_description.extend; 

11 

12            t_id(t_id.last)                                     := i; 

13            t_description(t_description.last) := 'Description: ' || To_Char(i); 

14        END LOOP; 

15 

16        FOR i IN t_id.first .. t_id.last LOOP 

17            INSERT INTO test1 (id, description) 

18            VALUES (t_id(i), t_description(i)); 

19        END LOOP; 

20 

21        COMMIT; 

22    END; 

23    / 

PL/SQL procedure successfully completed 

Executed in 141.233 seconds 

SQL> truncate table test1; 

Table truncated 

Executed in 0.631 seconds 

SQL> 

16        FORALL i IN t_id.first .. t_id.last 

19 

20        COMMIT; 

21    END; 

22    / 

Executed in 27.52 seconds 

SQL> select count(*) from test1; 

    COUNT(*) 

---------- 

        100000 

Executed in 0.04 seconds

本文轉自 牛海彬 51CTO部落格,原文連結:http://blog.51cto.com/newhappy/136920,如需轉載請自行聯系原作者