我们可以动态指定并行度吗?
问题描述:
我有使用并行选择一个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;
答
为什么不强制度会话:
alter session force parallel dml parallel <dop>;
alter session force parallel query parallel <dop>;
没有暗示你可以细粒状定义你喜欢的程度。
该死......我是怎么错过这个选项的。谢谢Olie。 – Vivek