暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle DBMS_PALLEL_EXECTE获取以特殊顺序工作的块

askTom 2017-02-07
206

问题描述

嗨,汤姆,

我正在使用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块在我开始工作之前已经完成”) ......但这是个很容易的斜坡。您可以很容易地让自己陷入死锁风格的场景中,在这种场景中,作业无法启动,并且在彼此等待,等等。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论