Oracle SQL七次提速技巧

时间:2021-05-31 12:46:45
以下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;