2011-08-23 54 views
5

我有使用並行選擇一個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。這是一個正確的方法嗎?如果沒有,我的要求是否還有其他解決方案?

回答

3

維韋克,

你可以使用動態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

2

爲什麼不使用Oracle自動確定並行?

+0

如何做到這一點?通過使用'默認'?如果是,不會使用所有可用的cpus嗎? – Vivek

+0

@Vivek'default'是別的。當您將'parallel_degree_policy'參數設置爲'AUTO'時,Oracle可以動態確定DOP。 – psur

1

爲什麼不強制度會話:

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

沒有暗示你可以細粒狀定義你喜歡的程度。

相關問題