Oracle SQL七次提速技巧

以下SQL执行时间按序号递减。

1,动态SQL,没有绑定变量,每次执行都做硬解析操作,占用较大的共享池空间,若共享池空间不足,会导致其他SQL语句的解析信息被挤出共享池。

create or replace procedure proc1

as

begin

for i in 1..100000 loop

execute immediate 'insert into t values('||i||')';

commit;

end loop;

end;

2,动态SQL,绑定变量,SQL语句只要执行一次硬解析即可。

create or replace procedure proc2

as

begin

for i in 1..100000 loop

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

commit;

end loop;

end;

3,静态SQL语句,在执行之前的编译阶段就已经解析,动态SQL在执行的过程中再解析。

create or replace procedure proc3

as

begin

for i in 1..100000 loop

insert into t values(i);

commit;

end loop;

end;

4,批量提交,减少commit次数能显著减少LGWR的触发次数,commit操作不是写数据,而是记录SCN,所以commit操作的时间并不长,但提交量大时仍有区别。

create or replace procedure proc4

as

begin

for i in 1..100000 loop

insert into t values(i);

end loop;

commit;

end;

5,逐条插入变成集合操作,整批地写入DATA BUFFER中,然后再刷新到硬盘。

insert into t select rownum from dual connect by level<=100000;

6,直接路径读写方式:跳过DATA BUFFER,将数据直接写入到硬盘。

缺点:在DATA BUFFER中没有预存,所以此操作后的第一次读会有物理读。

优点:一般用于海量数据迁移,数据量远超物理内存。

create table t as select rownum x from dual connect by level <= 100000;

7,依据硬件环境,开启一定的并行。

缺点:占用大量CPU资源。

create table t nologging parallel xx as select rownum x from dual connect by level <= 100000;