2009-05-19 9 views
11

में एकाधिक पंक्तियों को सम्मिलित एकाधिक पंक्ति ओरेकल दो दृष्टिकोण में डालने के बारे में discussion में प्रदर्शन किया गया:ओरेकल

पहले:

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE) 
      select 8000,0,'Multi 8000',1 from dual 
union all select 8001,0,'Multi 8001',1 from dual 

दूसरा:

INSERT ALL 
    INTO t (col1, col2, col3) VALUES ('val1_1', 'val1_2', 'val1_3') 
    INTO t (col1, col2, col3) VALUES ('val2_1', 'val2_2', 'val2_3') 
    INTO t (col1, col2, col3) VALUES ('val3_1', 'val3_2', 'val3_3') 
    . 
    . 
    . 
SELECT 1 FROM DUAL; 

किसी को भी वरीयता का तर्क किया जा सका एक दूसरे का उपयोग करने के लिए?

पीएस मैंने खुद कोई शोध नहीं किया (यहां तक ​​कि स्पष्टीकरण योजना), इसलिए किसी भी जानकारी या राय की सराहना की जाएगी।

धन्यवाद।

उत्तर

2

UNION ALL का उपयोग करने वाले बयान सैद्धांतिक रूप से एक छोटा प्रदर्शन नुकसान है क्योंकि इसे सम्मिलित होने से पहले सभी बयानों के परिणामों को जोड़ना होगा। INSERT ALL में यह नुकसान नहीं है क्योंकि अंतिम परिणाम पहले से ही लाइन-दर-लाइन संसाधित किया जा सकता है।

लेकिन व्यावहारिक रूप से ओरेकल के अंदर ऑप्टिमाइज़र को अंतर को नगण्य बनाना चाहिए और यह आपकी प्राथमिकताओं पर निर्भर करता है।

मेरी राय में INSERT ALL दोनों के बेहतर मानव-पठनीय है जबकि UNION ALL संस्करण इस तरह की एक प्रविष्टि स्वचालित रूप से उत्पन्न होने पर कम जगह ले रही है।

+0

निष्कर्ष से सहमत हुए, लेकिन: नाइटपिक: इन आईएनएसईआरटी कथन किसी भी मूल्य को वापस नहीं करते हैं, इसलिए यह कहने के लिए अर्थहीन है कि "सम्मिलित होने से पहले" या "लाइन-बाय-लाइन" कुछ भी होता है। वैसे भी, वह यूनियन का उपयोग कर रहा है इसलिए इस तरह की कोई समस्या नहीं है, अगर आप यही सोच रहे थे। –

+1

एक त्वरित "व्याख्या योजना" से पता चलता है कि INSERT सभी 4 लाइनों के साथ int SCOTT.EMP की लागत 2 (1 बहु-तालिका सम्मिलन केवल दोहरी चयन में सीपीयू-लागत के साथ होती है) जबकि यूनियन सभी संस्करणों की लागत होती है 8 (प्रत्येक चयन के साथ दूसरे 2)। यह क्रमबद्ध नहीं है लेकिन परिणामों के संयोजन और एकल (कम से कम फास्ट ड्यूल) चुनता है जो लागत पैदा कर रहा है। – Kosi2801

3

मुझे संदेह होगा कि समाधान 1 एक हैक का एक सा है जो काम करता है और शायद सभी डालने के डिजाइन किए गए विकल्प से कम कुशल है।

सम्मिलित सभी वास्तव में आप एक का चयन करें, जैसे की वजह से 1 से अधिक तालिका में कई पंक्तियों को सम्मिलित करने के लिए बनाया गया है:

Insert ALL 
into 
    t1 (c1, c2) values (q1, q2) 
    t2 (x1, x2) values (q1, q3) 
select q1, q2, q3 from t3 

आप पंक्तियों के हजारों लोड करना चाहते हैं और वे में नहीं हैं डेटाबेस पहले से ही, मुझे नहीं लगता कि यह करने का यह सबसे अच्छा तरीका है - यदि आपका डेटा किसी फ़ाइल में है, तो आप बाहरी टेबल या एसक्यूएल लोडर को कुशलतापूर्वक पंक्तियों को सम्मिलित करने के लिए देखना चाहते हैं।

7

प्रदर्शन के दृष्टिकोण से, ये प्रश्न समान हैं।

UNION ALL प्रदर्शन को चोट नहीं पहुंचाएगा, क्योंकि OracleUNION 'एडी क्वेरी केवल अनुमानित होने पर अनुमान लगाता है, यह पहले परिणामों को कैश नहीं करता है।

SELECT सिंटैक्स उस अर्थ में अधिक लचीला है कि अगर आप कुछ बदलना चाहते हैं तो SELECT क्वेरी को अधिक आसानी से प्रबंधित कर सकते हैं।

उदाहरण के लिए, इस क्वेरी:

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE) 
      select 8000,0,'Multi 8000',1 from dual 
union all select 8001,0,'Multi 8001',1 from dual 

INSERT 
INTO pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE) 
SELECT 7999 + level, 0, 'Multi ' || 7999 + level, 1 
FROM dual 
CONNECT BY 
     level <= 2 

के रूप में लिखा जा सकता है उचित संख्या के साथ 2 की जगह रखकर आप आप चाहते हैं पंक्तियों के किसी भी संख्या प्राप्त कर सकते हैं।

INSERT ALL के मामले में, आपको गंतव्य तालिका विवरण को डुप्लिकेट करना होगा, यदि आपको 40 पंक्तियों की आवश्यकता है, तो कम पढ़ने योग्य है।

+1

ध्यान दें कि 'SOME_SEQUENCE.NEXTVAL' मान के रूप में उपयोग करते हुए, ओरेकल त्रुटि ** ORA-02287 देता है: अनुक्रम संख्या यहां ** (ओरेकल 11 जी) की अनुमति नहीं है। यहां एक वर्कअराउंड का वर्णन किया गया है: http://www.orafaq.com/forum/t/54217/2/ - 'INSERT में आज़माएं ... SOME_SEQUENCE .EXTVAL, T. * से चुनें (चुनें ... यूनियन सभी चुनें। ..) टी' –

3

INSERT ALL विधि में तालिका में बड़ी संख्या में पंक्तियों को डालने में समस्या है।

मैं हाल ही में एकल एसक्यूएल कथन के साथ एक तालिका में 1130 पंक्तियां डालना चाहता था।

ORA-24335 - cannot support more than 1000 columns

जब मैं INSERT INTO .. UNION ALL .. दृष्टिकोण सब कुछ इस्तेमाल किया ठीक चला गया: जब मैं INSERT ALL विधि के साथ ऐसा करने की कोशिश की मैं निम्नलिखित त्रुटि मिली।

बीटीडब्ल्यू। इससे पहले कि मैं इस चर्चा :)

2

मैं कुछ परीक्षण करने की कोशिश की है और तेजी से समाधान

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE) 
      select 8000,0,'Multi 8000',1 from dual 
union all select 8001,0,'Multi 8001',1 from dual 

बफरिंग 300 < के बीच होना चाहिए पाया मैं यूनिअन सभी विधि के बारे में पता नहीं था -> 400 पंक्तियों (मैं के साथ की कोशिश की odbc, यह मान इसकी कॉन्फ़िगरेशन के बारे में निर्भर करता है)

-2

आपको ऐरे-सम्मिलन पर विचार करना चाहिए।

  • आसान एसक्यूएल
  • सेटअप करने के लिए कुछ क्लाइंट की ओर कोडिंग की जरूरत सरणी-पैरामीटर

इस तरह नेटवर्क यातायात को कम करने के कुछ सौ आवेषण एक बैच में किया जाना चाहिए अगर है ।

-1

यदि आपके पास 1000 से अधिक हैं जो सम्मिलित कथन हैं तो सभी डालने वाले कथन को .sql फ़ाइल में रखें और उसे टॉड या SQL डेवलपर में खोलें और फिर निष्पादित करें। सभी रिकॉर्ड डाले जाएंगे।

+0

ओपी जानना चाहता था कि उसने जिन दृष्टिकोणों का उल्लेख किया है, उन्हें दूसरे पर प्राथमिकता दी जानी चाहिए, यह एसक्यूएल को निष्पादित करने के तरीके के बारे में नहीं है। – dlatikay