我从Oracle 数据库 11g: 面向 DBA 和开发人员的重要新特性
http://www.oracle.com/technology/global/cn/pub/articles/oracle-database-11g-top-features/index.html
测试了一些个人觉得对日常工作有用的特性进行测试。
需要详细信息请猛击上方链接或者查阅相关文档。
2.并行DBMS_PARALLEL_EXECUTE
这个新特性引入一个Package:DBMS_PARALLEL_EXECUTE,
通过这个包可以将一个任务调度为并行,而此前我们需要手工来编写程序,
通过rowid或者主键还分割,用11gR2,这个工作能简化很多。
根据测试,oracle是提交job来实现并行,和咱们实现的方式一样。
官方文档推荐这种做法用作大数据量的更新。
create table TEMP_ZHJ_20101022 nologging as
select * from user_objects;
insert into temp_zhj_20101022 select * from user_objects;
commit;
DECLARE
l_sql_stmt VARCHAR2(1000);
l_try NUMBER;
l_status NUMBER;
BEGIN
-- Create the TASK
dbms_parallel_execute.create_task('mytask');
-- Chunk the table by ROWID
dbms_parallel_execute.create_chunks_by_rowid('mytask',
'SYS',
'TEMP_ZHJ_20101022',
TRUE,
100);
-- Execute the DML in parallel
l_sql_stmt := 'update /*+ ROWID (dda) */ TEMP_ZHJ_20101022 e
SET e.EDITION_NAME = ''ORACLE11G''
WHERE rowid BETWEEN :start_id AND :end_id';
dbms_parallel_execute.run_task('mytask',
l_sql_stmt,
dbms_sql.native,
parallel_level => 10);
-- If there is an error, RESUME it for at most 2 times.
l_try := 0;
l_status := dbms_parallel_execute.task_status('mytask');
WHILE (l_try < 2 AND l_status != dbms_parallel_execute.finished)
LOOP
l_try := l_try + 1;
dbms_parallel_execute.resume_task('mytask');
l_status := dbms_parallel_execute.task_status('mytask');
END LOOP;
-- Done with processing; drop the task
dbms_parallel_execute.drop_task('mytask');
END;