Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

क्या Oracle के डायनेमिक SQL के भीतर समानांतर संकेत समानांतर में चलता है?

TLDR

शायद आप समानांतर डीएमएल को सक्षम करना भूल गए हैं।

ALTER SESSION ENABLE PARALLEL DML;

अतिरिक्त यदि आप बल समानांतर निष्पादन आप आमतौर पर नहीं . करते हैं समानांतर संकेतों . का उपयोग करें और इसके विपरीत।

नमूना सेटअप (11.2)

create table TAB_HIST (
col1 int,
col2 int,
col3 varchar2(4000))
PARTITION BY RANGE (col1) 
interval(1000000)
(
  partition p_init values less than (1000000) 
); 


create table TAB_SRC (
col1 int,
col2 int,
col3 varchar2(4000)
)
PARTITION BY RANGE (col1) 
interval(1000000)
(
  partition p_init values less than (1000000) 
);

insert into tab_src
select rownum, rownum,  rpad('x',1000,'y') from dual connect by level <= 100000;
commit;

सम्मिलित करें

आपको समानांतर DML सक्षम करें पहले चरण में

ALTER SESSION ENABLE PARALLEL DML;

ध्यान दें कि वैकल्पिक रूप से एक संकेत का उपयोग किया जा सकता है

INSERT /*+ ENABLE_PARALLEL_DML */ …

इसके अतिरिक्त यदि आप बल समानांतर DML और QUERY, आप आमतौर पर समानांतर संकेतों . का उपयोग नहीं करते हैं . मैं APPEND . के साथ एक डायरेक्ट इंसर्ट का संकेत दे रहा हूं जिसका उपयोग अक्सर इस स्थिति में किया जाता है।

DECLARE
v_parallel_degree NUMBER := 2;
BEGIN
    EXECUTE IMMEDIATE 'ALTER SESSION FORCE PARALLEL DML PARALLEL ' || v_parallel_degree;
    EXECUTE IMMEDIATE 'ALTER SESSION FORCE PARALLEL QUERY PARALLEL ' || v_parallel_degree;

    EXECUTE IMMEDIATE 'INSERT /*+ APPEND */ INTO TAB_HIST  
                SELECT  *
                FROM  TAB_SRC PARTITION(P_INIT)';
END;
/

कैसे जांचें कि क्या टेबल समानांतर में डाली गई थी? सबसे आसान तरीका है टेबल को क्वेरी करना (कमिट करने से पहले) - अगर आपको बोलो एरर मिलता है, तो यह एक समानांतर डायरेक्ट इंसर्ट होता है।

select count(*) from TAB_HIST;
ORA-12838: cannot read/modify an object after modifying it in parallel

सूचकांक

यदि आप create index . में समानांतर डिग्री निर्दिष्ट करते हैं कथन आपको सक्षम की आवश्यकता नहीं है या बल कुछ भी।

DECLARE
v_parallel_degree NUMBER := 2;
BEGIN
    
    EXECUTE IMMEDIATE 'CREATE UNIQUE INDEX idx_pk ON TAB_HIST
                 (COL1,COL2,COL3)
                 LOCAL
                 NOLOGGING PARALLEL ' || v_parallel_degree;
END;
/

डेटा डिक्शनरी में डिग्री को देखने के लिए चेक उतना ही सरल है

select DEGREE from user_indexes where table_name = 'TAB_HIST';

DEGREE 
--------- 
2

ध्यान दें कि समानांतर मोड में इंडेक्स बनाने के बाद आप अक्सर डीओपी को एक पर रीसेट करना चाहते हैं। अन्यथा कुछ सरल नेस्टेड लूप प्रश्न भ्रमित हो सकते हैं और एक समानांतर क्वेरी खोलेंगे...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SELECT DISTINCT और SELECT UNIQUE के बीच का अंतर

  2. प्रत्येक वर्ण को एक स्ट्रिंग में एक पंक्ति में बदलें

  3. पता लगाएं कि ओरेकल में कौन सी तिमाही तिथि संबंधित है

  4. मैं user_objects जैसे सिस्टम दृश्यों की पूरी परिभाषा (एसक्यूएल) कैसे प्राप्त कर सकता हूं?

  5. डिकोड उपनाम पर ORA-00904 अमान्य पहचानकर्ता