我有一个使用并行性的选择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如何。这是正确的方法吗?如果没有,是否有其他解决方案符合我的要求?
答案 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>;
如果没有暗示,你可以精细地定义你喜欢的程度。