由于系统进入到压力测试阶段,需要准备大量数据来模拟测试环境,其中就牵涉到一些大的数据量的操作。以下是一些心得。
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. 对大数据量操作的效率的调优
按照一般情况下的调优,当然是创建一个3000万数据的临时表,然后以这个临时作为基础数据,写存储过程,使用循环,不断插入数据:
(假设B表是目标表,B_TEMP是我建立的包含了3000万数据的临时表,B的字段也有3个,x,y,z,其中y,z分别是年和月)
--------------------这样写的结果就是速度超慢---------------------------------------
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. 将表置为“无事件记录”模式
在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,大幅提高执行效率。当然,写的不对的请大家指正,并强烈期待有高手前来补充。