2010-10-25

Oracle11g新特性_并行DBMS_PARALLEL_EXECUTE

我从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;