关于 ORACLE 大数据量操作 的调优

来源:互联网 发布:大数据分析关键技术 编辑:程序博客网 时间:2024/06/06 00:36

由于系统进入到压力测试阶段,需要准备大量数据来模拟测试环境,其中就牵涉到一些大的数据量的操作。以下是一些心得。


1.   如果需要对一个大数据量的表进行全表更新,那是非常耗时的。那么此时不如使用 CREATE table_temp as (select b.x,b.y,b.z from table b )来代替update。
以下是几种可以使用这种方法的场景:

a.   假设表A有3个字段(x,y,z),其中y需要被全盘更新为一个统一的值1

那么可以这样:
a.1  先建立一个a的临时表A_temp   create table A_temp as select  t.x,1,t.z    from A t;
a.2   然后把A表上的建立索引、主键一类的SQL语句记录下来
a.3   然后drop掉A表,并且把A_temp表改名为A
a.4   最后在A表上重建索引、主键
这两者之间的效率相差数十倍。


2.  对大数据量操作的效率的调优


这里以插入作为例子。我们大概需要插入36组量级为3000万的数据,按照年和月进行翻倍,意思就是:其他所有的字段内容都不变,只有年月发生变化
按照一般情况下的调优,当然是创建一个3000万数据的临时表,然后以这个临时作为基础数据,写存储过程,使用循环,不断插入数据:
(假设B表是目标表,B_TEMP是我建立的包含了3000万数据的临时表,B的字段也有3个,x,y,z,其中y,z分别是年和月)
 

--------------------这样写的结果就是速度超慢---------------------------------------


create or replace procedure insert_p as
month integer;
year integer;
nowdate date := sysdate ;
begin


for c in 1..36 loop
select addmonths(nowdate ,1)  into nowdate from dual;
month :=to_number(to_char(nowdate,'MM'));
year :=to_number(to_char(nowdate,'yyyy'));
insert into B (x,y,z) select (x,year,month) from B_TEMP;
end loop;


end insert_p ;


然后,进入到数据库所在机器,使用机器上自带的sqlplus来执行这个存储过程insert_p 


--------------------这样写的结果就是速度超慢---------------------------------------



所以,我们要开启并发
简单的说,就是使用多个cpu同时来写(当然,前提是你有多个cpu)


启动并发的步骤如下:

a.   打开,并调整表的并行度(值根据cpu的个数来定)

b.   将表置为“无事件记录”模式


c.   调整会话的并行度

在sqlplus下敲入:alter session enable parallel dml;

d.  在sql语句中添加 parallel参数,以及 nologging参数


create or replace procedure insert_p as
month integer;
year integer;
nowdate date := sysdate ;
begin


for c in 1..36 loop
select addmonths(nowdate ,1)  into nowdate from dual;
month :=to_number(to_char(nowdate,'MM'));
year :=to_number(to_char(nowdate,'yyyy'));
insert into  /*+ parallel (B,8) */  B  nologging  (x,y,z) select/*+ parallel (B_TEMP,8) */  x,year,month  from B_TEMP;
end loop;


end insert_p ;

综上几步,可以最大限度地使用已有的CPU,大幅提高执行效率。当然,写的不对的请大家指正,并强烈期待有高手前来补充。


原创粉丝点击