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

Oracle में, स्क्रिप्ट के माध्यम से सम्मिलित करने का तेज़ तरीका?

समस्या

कुछ प्रकार के कथनों के साथ पार्सिंग समय तेजी से बढ़ सकता है, विशेष रूप से INSERT ALL . उदाहरण के लिए:

--Clear any cached statements, so we can consistently reproduce the problem.
alter system flush shared_pool;
alter session set sql_trace = true;

--100 rows
INSERT ALL
    INTO FileIds(Id,FileTypeGroupId) VALUES(1, 1)
    ...
    repeat 100 times
    ...
select * from dual;

--500 rows
INSERT ALL
    INTO FileIds(Id,FileTypeGroupId) VALUES(1, 1)
    ...
    repeat 500 times
    ...
select * from dual;

alter session set sql_trace = false;

ट्रेस फ़ाइल को tkprof के माध्यम से चलाएं, और आप देख सकते हैं कि बड़ी संख्या में पंक्तियों के लिए पार्स समय नाटकीय रूप से बढ़ता है। उदाहरण के लिए:

100 पंक्तियां:

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.06       0.05          0          1          0           0
Execute      1      0.00       0.00          0        100        303         100
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.06       0.05          0        101        303         100

500 पंक्तियाँ:

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1     14.72      14.55          0          0          0           0
Execute      1      0.01       0.02          0        502       1518         500
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2     14.74      14.58          0        502       1518         500

समाधान

  1. अपने बड़े बयान को कई छोटे बयानों में तोड़ें। इष्टतम आकार खोजना मुश्किल है। ओरेकल के कुछ संस्करणों में पंक्तियों की एक जादुई संख्या है जो समस्या का कारण बनेगी। मैं आमतौर पर लगभग 100 पंक्तियों के लिए जाता हूं - समूहीकरण के अधिकांश लाभ प्राप्त करने के लिए पर्याप्त है, लेकिन पार्सिंग बग से बचने के लिए पर्याप्त कम है। या...
  2. कोशिश करें insert into ... select ... from dual union all ... इसके बजाय विधि। यह आमतौर पर बहुत तेजी से चलता है, हालांकि इसका पार्सिंग प्रदर्शन आकार के साथ काफी कम हो सकता है।
  3. ओरेकल को अपग्रेड करें। नए संस्करणों में पार्सिंग प्रदर्शन में सुधार हुआ है। मैं अब इस मुद्दे को संस्करण 12.2 में पुन:पेश नहीं कर सकता।

चेतावनी

इससे गलत सबक मत सीखो। यदि आप SQL प्रदर्शन के बारे में चिंतित हैं, तो 99% बार आप समान चीजों को अलग-अलग करने के बजाय एक साथ समूहबद्ध करना बेहतर समझते हैं। आप चीजों को सही तरीके से कर रहे हैं, आप बस एक अजीब बग में भाग गए। (मैंने माई ओरेकल सपोर्ट खोजा लेकिन इसके लिए कोई आधिकारिक बग नहीं मिला।)




  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. C# और ODP.NET से पैकेज में फ़ंक्शन को कॉल करने के लिए कोड

  3. शुरुआत और अंत के साथ दो पीएलएसक्यूएल कथन, अलग-अलग ठीक चलते हैं लेकिन एक साथ नहीं?

  4. Oracle PL/SQL को सर्वर का IP v4 मिलता है?

  5. UTL_FILE.FOPEN () प्रक्रिया निर्देशिका के लिए पथ स्वीकार नहीं कर रही है?