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

时间:2011-08-23 11:37:39

标签: sql oracle oracle11g parallel-processing

我有一个使用并行性的选择SQL查询,类似这样的

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

正如你在这里看到的,我已经对程度进行了硬编码,但我不想这样做,因为在执行此代码的所有数据库中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如何。这是正确的方法吗?如果没有,是否有其他解决方案符合我的要求?

3 个答案:

答案 0 :(得分:3)

的Vivek,

您可以使用动态SQL在PL / SQL函数或过程中构建INSERT语句。这样你就可以利用你已经检索过的变量“degree”。

类似的东西:

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; 

答案 1 :(得分:2)

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

答案 2 :(得分:1)

为什么不强制会话的学位:

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

如果没有暗示,你可以精细地定义你喜欢的程度。