oracle提供了很好用的大数据量数据更新的函数dbms_parallel_execute,改用dbms_parallel_execute执行,可以进行并行更新并且事务大小可控。
以下在命令窗口执行:
- 首先创建一个TASK,名称为update_pzjcxx:
1
exec dbms_parallel_execute.create_task('update_pzjcxx');
- 把将要更新的表按照ROWID进行分批,分到各个CHUNK中:BY_ROW:分CHUNK的类型。如果为TRUE,则后面的CHUNK_SIZE表示是行;如果是FALSE,则后面的CHUNK_SIZE表示的是BLOCK。
1
exec dbms_parallel_execute.create_chunks_by_rowid(task_name => 'update_pzjcxx',table_owner => 'V7PROD',table_name => 'KCDY_PZJCXX',by_row => true,chunk_size => 10000);
CHUNK_SIZE:CHUNK大小。如果BY_ROW为TRUE,表示多少行分为一个CHUNK;如果BY_ROW为FALSE,则表示多少块分为一个CHUNK。 - 执行并行任务:start_id和end_id是两个占位符,用来标识CHUNK的开始和结束;PARALLEL表示平行度;LANGUAGE_FLAG意义如下:
1
2exec DBMS_PARALLEL_EXECUTE.run_task(task_name => 'update_pzjcxx',sql_stmt => 'update /*+ROWID(dda)*/ kcdy_pzjcxx set ( ZHHAOXUH, CHAPBHAO, HUOBDAIH, CHAOHUBZ, NLJSKACS ) =
( select ZHHAOXUH, CHAPBHAO, HUOBDAIH, CHAOHUBZ, SFYZBZHI from kdpy_jbxinx where zhanghao = kcdy_pzjcxx.zhanghao and farendma = ''9999'' ) where rowid between :start_id and :end_id',language_flag => DBMS_SQL.native,parallel_level => 16);
V6 (or 0) specifies version 6 behavior
NATIVE (or 1) specifies normal behavior for the database to which the program is connected
V7 (or 2) specifies Oracle database version 7 behavior
- 查看task执行情况
1
2
3
4select * from dba_parallel_execute_tasks;
select * from user_parallel_execute_tasks;
select * from dba_parallel_execute_chunks ;
select * from user_parallel_execute_chunks ;
每个CHUNK是在单独一个事务中提交的。所以某几个CHUNK发生错误后,可以修正错误,并使用下面的方法来继续未完成的CHUNK的任务:
4.1
1 | exec dbms_parallel_execute.resume_task(task_name => 'update_pzjcxx',sql_stmt => 'update /*+ROWID(dda)*/ kcdy_pzjcxx set ( ZHHAOXUH, CHAPBHAO, HUOBDAIH, CHAOHUBZ, NLJSKACS ) = |
4.2 停止执行:
1 | exec dbms_parallel_execute.stop_task(update_pzjcxx); |
最后可以删除完成的任务:
1 | exec dbms_parallel_execute.drop_task( 'update_pzjcxx' ); |
–开启计时
1 | set timing on |
–设置并行收集
1 | exec dbms_stats.set_global_prefs('CONCURRENT','TRUE'); |
–开始收集全库统计信息
1 | begin |
–关闭并行收集
1 | exec dbms_stats.set_global_prefs('CONCURRENT','FALSE'); |
–gather——重新分析整个架构(Schema)。
–gather empty——只分析目前还没有统计的表。
–gather stale——只重新分析修改量超过10%的表(这些修改包括插入、更新和删除)。
–gather auto——重新分析当前没有统计的对象,以及统计数据过期(变脏)的对象。注意,使用gather auto类似于组合使用gather stale和gather empty。
begin
dbms_stats.gather_schema_stats(ownname=>user,options=>’gather stale’,degree => 32);
end;