我们可以动态指定并行度吗?

问题描述:

我有使用并行选择一个SQL查询,像这样我们可以动态指定并行度吗?

INSERT/*+ APPEND PARALLEL (tst, 6) */ INTO test_table tst 
       (
        ************** 
        ************** 
        ************** 
       ) 
    SELECT /*+ PARALLEL (a, 6) */ DISTINCT 
        ************** 
        ************** 
        ************** 
     FROM src_table a; 

正如你可以看到这里,我已经硬编码的程度,但是,我不想这样做,因为数量执行此代码的所有DB中的CPU不相同。

My requirement:我需要查询V$PARAMETER可用的CPU数量,并在我的查询中使用result-2的值。事情是这样的......

DECLARE 
    degree  varchar2(1); 
BEGIN 
select value-2 INTO degree from v$parameter where name='cpu_count'; 

      INSERT/*+ APPEND PARALLEL (tst, degree) */ INTO test_table tst 
      (
       ************** 
       ************** 
       ************** 
      ) 
SELECT /*+ PARALLEL (a, degree) */ DISTINCT 
       ************** 
       ************** 
       ************** 
    FROM src_table a; 
END; 

但是,它不工作,我希望它是,我看到32个并行线程,不论可用的CPU。这是一个正确的方法吗?如果没有,我的要求是否还有其他解决方案?

维韦克,

你可以使用动态SQL的PL/SQL函数或过程中建立起自己的INSERT语句。这样你就可以利用你已经检索到的变量“度”。

喜欢的东西:

DECLARE 
    degree varchar2(1); 
BEGIN 
    select value-2 
    INTO degree 
    from v$parameter 
    where name='cpu_count';    

    EXECUTE IMMEDIATE('INSERT /*+ APPEND PARALLEL (tst, '||degree||') */ '|| 
        ' INTO test_table tst ('|| 
        '  ************** '|| 
        '  ************** '|| 
        '  ************** '|| 
        ' ) '|| 
        'SELECT /*+ PARALLEL (a, '||degree||') */ '|| 
        '  DISTINCT '|| 
        '  ************** '|| 
        '  ************** '|| 
        '  ************** '|| 
        ' FROM src_table a'); 
END; 
+0

该死......我是怎么错过这个选项的。谢谢Olie。 – Vivek

为什么不使用Oracle自动确定并行?

+0

如何做到这一点?通过使用'默认'?如果是,不会使用所有可用的cpus吗? – Vivek

+0

@Vivek'default'是别的。当您将'parallel_degree_policy'参数设置为'AUTO'时,Oracle可以动态确定DOP。 – psur

为什么不强制度会话:

alter session force parallel dml parallel <dop>; 
alter session force parallel query parallel <dop>; 

没有暗示你可以细粒状定义你喜欢的程度。