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

Oracle में 10 मिनट के भीतर 10 मिलियन प्रश्नों का INSERT?

मुझे पता है कि दूसरों ने इसका उल्लेख किया है और आप इसे सुनना नहीं चाहते हैं लेकिन एसक्यूएल * लोडर या बाहरी टेबल का उपयोग करें। लगभग समान चौड़ाई वाली तालिकाओं के लिए मेरा औसत लोड समय 12.57 सेकंड है सिर्फ 10 मीटर से अधिक पंक्तियों के लिए। इन उपयोगिताओं को स्पष्ट रूप से डेटाबेस में डेटा को जल्दी से लोड करने के लिए डिज़ाइन किया गया है और इसमें बहुत अच्छे हैं। आपकी इनपुट फ़ाइल के प्रारूप के आधार पर इसमें कुछ अतिरिक्त समय दंड लग सकता है, लेकिन कुछ विकल्प हैं और लोड होने से पहले मुझे शायद ही कभी फ़ाइलों को बदलना पड़ा हो।

यदि आप ऐसा करने के इच्छुक नहीं हैं तो आपको अभी तक अपने हार्डवेयर को अपग्रेड करने की आवश्यकता नहीं है; आपको इसे जल्दी से लोड करने के लिए हर संभव बाधा को दूर करने की आवश्यकता है। उनकी गणना करने के लिए, निकालें:

  1. सूचकांक
  2. ट्रिगर
  3. अनुक्रम
  4. विभाजन

इन सब के साथ आप डेटाबेस को अधिक काम करने के लिए बाध्य कर रहे हैं और क्योंकि आप इसे लेन-देन के रूप में कर रहे हैं, आप डेटाबेस का पूरी क्षमता से उपयोग नहीं कर रहे हैं।

डेटा को एक अलग तालिका में लोड करें, जैसे ABC_LOAD . डेटा पूरी तरह से लोड होने के बाद एकल . प्रदर्शन करें ABC में INSERT स्टेटमेंट।

insert into abc
select abc_seq.nextval, a.*
  from abc_load a

जब आप ऐसा करते हैं (और यदि आप नहीं भी करते हैं) तो सुनिश्चित करें कि अनुक्रम कैश आकार सही है; उद्धृत करने के लिए:

<ब्लॉकक्वॉट>

जब कोई एप्लिकेशन अनुक्रम कैश में अनुक्रम तक पहुंचता है, तो ये अनुक्रम संख्याएं जल्दी से पढ़ी जाती हैं। हालांकि, यदि कोई एप्लिकेशन ऐसे अनुक्रम को एक्सेस करता है जो कैश में नहीं है, तो अनुक्रम संख्याओं का उपयोग करने से पहले अनुक्रम को डिस्क से कैश में पढ़ा जाना चाहिए।

यदि आपके एप्लिकेशन एक साथ कई अनुक्रमों का उपयोग करते हैं, तो आपका अनुक्रम कैश सभी अनुक्रमों को पकड़ने के लिए पर्याप्त नहीं हो सकता है। इस मामले में, अनुक्रम संख्याओं तक पहुंच के लिए अक्सर डिस्क रीड की आवश्यकता हो सकती है। सभी अनुक्रमों तक तेजी से पहुंच के लिए, सुनिश्चित करें कि आपके कैश में आपके अनुप्रयोगों द्वारा समवर्ती रूप से उपयोग किए जाने वाले सभी अनुक्रमों को रखने के लिए पर्याप्त प्रविष्टियां हैं।

इसका मतलब यह है कि यदि आपके पास इस क्रम का उपयोग करते हुए 10 धागे एक साथ 500 रिकॉर्ड लिख रहे हैं तो आपको 5,000 के कैश आकार की आवश्यकता है। ALTER SEQUENCE दस्तावेज़ बताता है कि इसे कैसे बदला जाए:

alter sequence abc_seq cache 5000

यदि आप मेरे सुझाव का पालन करते हैं तो मैं कैश आकार को लगभग 10.5m तक बढ़ा दूंगा।

APPEND संकेत का उपयोग करके देखें (Oracle Base भी देखें); यह ओरेकल को डायरेक्ट-पाथ इंसर्ट का उपयोग करने का निर्देश देता है, जो डेटा को सीधे टेबल के अंत में जोड़ता है बजाय इसे रखने के लिए जगह की तलाश में। यदि आपकी तालिका में अनुक्रमणिका हैं तो आप इसका उपयोग नहीं कर पाएंगे लेकिन आप इसका उपयोग ABC_LOAD में कर सकते हैं

insert /*+ append */ into ABC (SSM_ID, invocation_id , calc_id, ... )
select 'c','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'a','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'b','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'c','g',NULL, 'test', 123 , 'N', 'asdf' from dual

यदि आप APPEND संकेत का उपयोग करते हैं; मैं जोड़ूंगा TRUNCATE ABC_LOAD आपके द्वारा ABC . में डालने के बाद अन्यथा यह तालिका अनिश्चित काल तक बढ़ेगी। यह सुरक्षित होना चाहिए क्योंकि तब तक आप तालिका का उपयोग कर चुके होंगे।

आप उल्लेख नहीं करते कि आप किस संस्करण या संस्करण या ओरेकल का उपयोग कर रहे हैं। आप कई अतिरिक्त छोटी-छोटी तरकीबों का उपयोग कर सकते हैं:

  • Oracle 12c

    यह संस्करण पहचान स्तंभों का समर्थन करता है; आप इस क्रम से पूरी तरह छुटकारा पा सकते हैं।

    CREATE TABLE ABC(
       seq_no         NUMBER GENERATED AS IDENTITY (increment by 5000)
    
  • Oracle 11g r2

    यदि आप ट्रिगर रखते हैं; आप सीधे अनुक्रम मान निर्दिष्ट कर सकते हैं।

    :new.seq_no := ABC_seq.nextval;
    
  • Oracle Enterprise संस्करण

    यदि आप Oracle Enterprise का उपयोग कर रहे हैं तो आप ABC_LOAD . से INSERT को तेज़ कर सकते हैं समानांतर संकेत का उपयोग करके:

    abc_seq.nextval, a.* abc_load a से
    insert /*+ parallel */ into abc
    select abc_seq.nextval, a.*
      from abc_load a
    

    इससे इसकी अपनी समस्याएं हो सकती हैं (बहुत अधिक समानांतर प्रक्रियाएं आदि), इसलिए परीक्षण करें। यह हो सकता है छोटे बैच इंसर्ट के लिए मदद करें लेकिन इसकी संभावना कम है क्योंकि आप यह गणना करने में समय बर्बाद करेंगे कि कौन सा थ्रेड क्या प्रोसेस करेगा।

tl;डॉ

डेटाबेस के साथ आने वाली उपयोगिताओं का उपयोग करें।

यदि आप उनका उपयोग नहीं कर सकते हैं, तो उन सभी चीजों से छुटकारा पाएं जो इन्सर्ट को धीमा कर सकती हैं और इसे थोक में करें, 'क्योंकि यही डेटाबेस अच्छा है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle डेटाबेस में आने वाली सभी क्वेरीज़ दिखाएं

  2. संरचना का उपयोग कैसे करें और कॉलम सूची, refcursor के डेटाटाइप कैसे प्राप्त करें?

  3. JDBC में खुले कनेक्शन के लिए प्रोग्रामेटिक रूप से जाँच कर रहा है

  4. स्प्रिंग बैच ORA-08177:एकल कार्य, SERIALIZED आइसोलेशन स्तर चलाते समय इस लेन-देन के लिए पहुँच को क्रमबद्ध नहीं कर सकता

  5. मैं कैसे बता सकता हूं कि मेरे पास Oracle लेनदेन में अप्रतिबद्ध कार्य है या नहीं?