Viv*_*vek 5 sql oracle parallel-processing oracle11g
我有一个选择SQL查询,它使用并行,类似这样
INSERT/*+ APPEND PARALLEL (tst, 6) */ INTO test_table tst
(
**************
**************
**************
)
SELECT /*+ PARALLEL (a, 6) */ DISTINCT
**************
**************
**************
FROM src_table a;
Run Code Online (Sandbox Code Playgroud)
正如你在这里看到的,我已经对程度进行了硬编码,但我不想这样做,因为在执行此代码的所有数据库中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;
Run Code Online (Sandbox Code Playgroud)
但是,它没有像我预期的那样工作,我看到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;
Run Code Online (Sandbox Code Playgroud)