2011-08-23 3 views
5

मैं जो समानांतरवाद का प्रयोग कर एक का चयन करें SQL क्वेरी, इसक्या हम गतिशीलता की डिग्री गतिशील रूप से निर्दिष्ट कर सकते हैं?

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

की तरह कुछ है डिग्री हार्ड-कोडेड आप यहाँ देख सकते हैं, मैं है, लेकिन, मुझे क्या करना नहीं चाहते हैं कि, की संख्या के बाद से सीपीयू सभी डीबी में समान नहीं हैं जहां यह कोड निष्पादित किया जाता है।

My requirement: मैं उपलब्ध सीपीयू गिनती के लिए V$PARAMETER क्वेरी और अपनी क्वेरी में 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

विवेक,

आप गतिशील एसक्यूएल का प्रयोग कर एक PL/SQL समारोह या प्रक्रिया के भीतर अपने सम्मिलित बयान का निर्माण करने के सकता है। इस तरह आप वेरिएबल "डिग्री" का उपयोग कर सकते हैं जिसे आपने पहले से ही पुनर्प्राप्त कर लिया है।

कुछ की तरह:

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

डैन .... मैं इस विकल्प को कैसे चूक गया। धन्यवाद ओली। – Vivek

2

ओरेकल का उपयोग नहीं क्यों स्वचालित रूप से समानांतरवाद निर्धारित करने के लिए? इशारा आप बारीक आप की तरह डिग्री को परिभाषित ठीक कर सकते हैं बिना

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

:

+0

यह कैसे करें? 'डिफ़ॉल्ट' का उपयोग करके? यदि हां, तो क्या यह सभी उपलब्ध सीपीयू का उपयोग नहीं करेगा? – Vivek

+0

@ विवेक 'डिफ़ॉल्ट' कुछ और है। जब आप 'AUTO' पर 'parallel_degree_policy' पैरामीटर सेट करते हैं तो ओरेकल गतिशील रूप से डीओपी निर्धारित कर सकता है। – psur

1

क्यों साथ सत्र के लिए डिग्री मजबूर नहीं।

संबंधित मुद्दे