您的位置:首页 > 数据库 > Oracle

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

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

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,大幅提高执行效率。当然,写的不对的请大家指正,并强烈期待有高手前来补充。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: