关于 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,大幅提高执行效率。当然,写的不对的请大家指正,并强烈期待有高手前来补充。
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,大幅提高执行效率。当然,写的不对的请大家指正,并强烈期待有高手前来补充。
相关文章推荐
- 关于Oracle中各个命中率的计算以及相关的调优总结
- 关于在Oracle中读写文件的操作
- 其他关于oracle的操作链接
- Oracle关于时间/日期的操作
- 关于练习中,一些Oracle的操作
- Oracle 关于日期时间比较、格式转化等操作
- 关于mysql 和oracle 的常用字符串操作
- Oracle关于时间/日期的操作
- Oracle有关于用户的一些基本操作
- Oracle关于时间/日期的操作
- 关于ORACLE当中关于含有关键字作为字段的操作=查询,插入等=规范的双引号操作
- 关于大数据量的循环 每次都要操作数据库的办法
- Oracle关于时间/日期的操作
- 关于MySQL增、删、改列,以及修改表名的几种方法,同时和Oracle的操作进行比较
- oracle关于批量执行数据库的操作
- oracle中关于表的所有操作(创建删除表,修改表结构,创建约束,操作表数据,增删改查等)
- Oracle关于时间/日期的操作
- 重装系统后关于Oracle和plsql的操作纪实
- 浅谈Oracle 11g 发行版2 新安装后关于登录的一些基本操作
- oracle 中关于null的操作