问题描述
嗨,汤姆,
我正在使用DBMS_PALLEL_EXECTE包并行运行我的PL/SQL过程的工作。
这些块是由我自己的SQL生成的,它包含像这样的数值字段“优先级”
然后,我运行任务,并将其设置为2
下一个SQL获取结果
因此, SQL中用于创建块的“排序依据”表达式工作正常,因为user_parallel_execute_chunks中的CHUNK_ID根据表tmp_table中的字段“优先级”增加,但开始的第一个区块的ID大于最小值(23645804)。
有没有一种方法可以强制以特殊的顺序接收工作块?我预计块将以升序CHNK_ID的顺序工作(23645804,23645805,23645806...)
先谢了。
我正在使用DBMS_PALLEL_EXECTE包并行运行我的PL/SQL过程的工作。
这些块是由我自己的SQL生成的,它包含像这样的数值字段“优先级”
v_sql := '
select rowid, rowid
from tmp_table
order by priority
';
DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_SQL(
task_name => v_task_name,
sql_stmt => v_sql,
by_rowid => true
);
然后,我运行任务,并将其设置为2
v_sql_stmt := '
declare
v_schema_name varchar2(100);
v_sql varchar2(1000);
begin
select schema_name into v_schema_name
from tmp_table
where rowid between :start_id and :end_id;
v_sql :=
........
execute immediate v_sql;
end;
';
DBMS_PARALLEL_EXECUTE.run_task (
task_name => v_task_name,
sql_stmt => v_sql_stmt,
language_flag => DBMS_SQL.NATIVE,
parallel_level => 2
);
下一个SQL获取结果
SELECT * FROM user_parallel_execute_chunks c WHERE c.TASK_NAME=v_task_name; CHUNK_ID TASK_NAME STATUS START_ROWID END_ROWID JOB_NAME 23645805 RUNCR_TASK$_23645803 PROCESSED ABVN77AAIAAOFnbAAB ABVN77AAIAAOFnbAAB TASK$_17757_1 23645806 RUNCR_TASK$_23645803 ASSIGNED ABVN77AAIAAOFnbAAC ABVN77AAIAAOFnbAAC TASK$_17757_2 23645807 RUNCR_TASK$_23645803 ASSIGNED ABVN77AAIAAOFnbAAD ABVN77AAIAAOFnbAAD TASK$_17757_1 23645808 RUNCR_TASK$_23645803 UNASSIGNED ABVN77AAIAAOFnbAAE ABVN77AAIAAOFnbAAE null 23645809 RUNCR_TASK$_23645803 UNASSIGNED ABVN77AAIAAOFnbAAF ABVN77AAIAAOFnbAAF null 23645810 RUNCR_TASK$_23645803 UNASSIGNED ABVN77AAIAAOFnbAAG ABVN77AAIAAOFnbAAG null 23645811 RUNCR_TASK$_23645803 UNASSIGNED ABVN77AAIAAOFnbAAH ABVN77AAIAAOFnbAAH null 23645804 RUNCR_TASK$_23645803 UNASSIGNED ABVN77AAIAAOFnbAAA ABVN77AAIAAOFnbAAA null
因此, SQL中用于创建块的“排序依据”表达式工作正常,因为user_parallel_execute_chunks中的CHUNK_ID根据表tmp_table中的字段“优先级”增加,但开始的第一个区块的ID大于最小值(23645804)。
有没有一种方法可以强制以特殊的顺序接收工作块?我预计块将以升序CHNK_ID的顺序工作(23645804,23645805,23645806...)
先谢了。
专家解答
这不是并行执行的工作方式。在伪装下,我们提交调度器作业来同时运行任务。
因此,即使我们以块的顺序提交作业,也只是“第一个可用”调度器作业,它将获取提交的作业并处理它。假设每个作业运行所需的时间相同,您很可能会得到一个粗略的排序,但是没有保证。
你可以在你的过程中把它编码(即,“我是第7块,确保第1-6块在我开始工作之前已经完成”) ......但这是个很容易的斜坡。您可以很容易地让自己陷入死锁风格的场景中,在这种场景中,作业无法启动,并且在彼此等待,等等。
因此,即使我们以块的顺序提交作业,也只是“第一个可用”调度器作业,它将获取提交的作业并处理它。假设每个作业运行所需的时间相同,您很可能会得到一个粗略的排序,但是没有保证。
你可以在你的过程中把它编码(即,“我是第7块,确保第1-6块在我开始工作之前已经完成”) ......但这是个很容易的斜坡。您可以很容易地让自己陷入死锁风格的场景中,在这种场景中,作业无法启动,并且在彼此等待,等等。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




