使用bulk进行优化及优化原理

    下面有一条需求,向一张表插入1百万的数据,用存储过程实现。下面来做一个实验,用一种实现用了30S,如果改为bulk实现,不到2s。

SQL> drop table t purge;

表已删除。

SQL> set timing on

SQL> create table t (x  int);

SQL> begin

      for i in 1.. 1000000

       loop

           execute immediate 'insert into t values(:x)' using i;

       end loop;

       commit;

      end;

    /

PL/SQL 过程已成功完成。

已用时间:  00: 00: 30.24

SQL> truncate table t;

表被截断。

SQL> DECLARE

      TYPE V_X IS table of t%rowtype;

      records V_X;

      cursor cur_query is select rownum x from dual connect by level <=1000000;

    begin

      open cur_query;

      loop

        fetch cur_query bulk collect into records  LIMIT 100000;

          FORALL i in 1 .. records.count

           INSERT INTO T values records(i);

          exit when cur_query%notfound;

      end loop;

      commit;

   end;

   /

PL/SQL 过程已成功完成。

已用时间:  00: 00: 01.48

     优化原理:

       1. Oracle使用2个引擎来执行SQL和代码块:SQL引擎和PL/SQL引擎,SQL语句会导致在两个引擎之间进行context switch,从而影响性能。

       2.从本质上讲,使用特殊的block或者 subprogram来降低context switches可以提高性能。SQL语句在loop内使用 collection elements作为bind variables来运行时,就会产生大量的context switchesbulk相关的有2个语法:forall bulk collect

         FORALL:将数据打包,一次性从PL/SQL引擎发送给SQL引擎。

        bulk collect:将处理之后的结果集放到bulk collect里,然后一次性把bulk collectSQL引擎发送给PL/SQL引擎。           

        因为bulk减少2个引擎之间的context switches,从而提升了SQL性能,当要处理的数据量越大,使用bulk和不使用bulk性能区别就越明显。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值