Oracle 11g 使用 dbms_parallel_execute执行并行更新(二)

2014-11-24 17:24:22 · 作者: · 浏览: 2
d'; --Task名称


dbms_parallel_execute.create_task(task_name => vc_task); --手工定义一个Task任务;



--Define the Spilt


dbms_parallel_execute.create_chunks_by_rowid(task_name => vc_task,


table_owner => 'SYS',


table_name => 'T',


by_row => true,


chunk_size => 1000); --定义Chunk



vc_sql := 'update /*+ ROWID(dda) */t set DATA_OBJECT_ID=object_id+1 where rowid between :start_id and :end_id';

--Run the task


dbms_parallel_execute.run_task(task_name => vc_task,


sql_stmt => vc_sql,


language_flag => dbms_sql.native,


parallel_level => 2); --执行任务,确定并行度



--Controller


n_try := 0;


n_status := dbms_parallel_execute.task_status(task_name => vc_task);


while (n_try<2 and n_status != dbms_parallel_execute.FINISHED) loop


dbms_parallel_execute.resume_task(task_name => vc_task);


n_status := dbms_parallel_execute.task_status(task_name => vc_task);


end loop;



--Deal with Result


dbms_parallel_execute.drop_task(task_name => vc_task);


end;


/



从调用过程来看,这个并行操作包括下面几个步骤:



ü 定义Task;


ü 确定chunk划分方法,定义每个chunk的范围信息;


ü 执行作业,确定并行作业进程数量;



这个调用过程和我们常见的并行方式有很大差异,类似于Oracle的Job Schedule机制。由于执行过程比较长,我们可以有比较从容的查看并行执行包的情况。


从user_parallel_execute_tasks中,看到当前作业的关键信息。注意:chunk_type表示的是采用什么样的划分方法。JOB_PREFIX对应的则是Schedule中的内容。


SQL> select task_name, chunk_type, JOB_PREFIX from user_parallel_execute_tasks;



TASK_NAME CHUNK_TYPE JOB_PREFIX


-------------------- ------------ ------------------------------


Task 1: By Rowid ROWID_RANGE TASK$_4



在user_parallel_execute_chunks中,作业的所有chunk划分,每个chunk对应的一行数据。其中包括这个chunk的起始和截止rowid。对应的chunk取值对应的就是每个chunk的数据行数。


SQL> select chunk_id, task_name, status, start_rowid, end_rowid from user_parallel_execute_chunks where rownum<10;


CHUNK_ID TASK_NAME STATUS START_ROWID END_ROWID

---------- -------------------- -------------------- ------------------ ------------------

1 Task 1: By Rowid PROCESSED AAATLKAAHAAAACAAAA AAATLKAAHAAAACxCcP

2 Task 1: By Rowid PROCESSED AAATLKAAHAAAACyAAA AAATLKAAHAAAADjCcP

3 Task 1: By Rowid PROCESSED AAATLKAAHAAAADkAAA AAATLKAAHAAAAD/CcP

4 Task 1: By Rowid PROCESSED AAATLKAAHAAAAEAAAA AAATLKAAHAAAAExCcP

5 Task 1: By Rowid PROCESSED AAATLKAAHAAAAEyAAA AAATLKAAHAAAAFjCcP

6 Task 1: By Rowid PROCESSED AAATLKAAHAAAAFkAAA AAATLKAAHAAAAF/CcP

7 Task 1: By Rowid PROCESSED AAATLKAAHAAAAGAAAA AAATLKAAHAAAAGxCcP

8 Task 1: By Rowid PROCESSED AAATLKAAHAAAAGyAAA AAATLKAAHAAAAHjCcP

9 Task 1: By Rowid PROCESSED AAATLKAAHAAAAHkAAA AAATLKAAHAAAAH/CcP


9 rows selected



作为user_parallel_execute_chunks,一个很重要的字段就是status状态列,用于标注每个chunk的处理情况。我们可以依据这个字段来判断任务完成情况。


SQL> select status, count(*) from user_parallel_execute_chunks group by status;



STATUS COUNT(*)


-------------------- ----------


ASSIGNED 2


UNASSIGNED 5507


PROCESSED 938



(过一会之后…….)


SQL> select status, count(*) from user_parallel_execute_chunks group by status;



STATUS COUNT(*)


-------------------- ----------


ASSIGNED 2


UNASSIGNED 5441


PROCESSED 1004



从status字段,我们可以分析出并行作业工作的原理。每一个chunk记录在划分之后,都是设置为unassig