समस्या
कुछ प्रकार के कथनों के साथ पार्सिंग समय तेजी से बढ़ सकता है, विशेष रूप से 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
समाधान
- अपने बड़े बयान को कई छोटे बयानों में तोड़ें। इष्टतम आकार खोजना मुश्किल है। ओरेकल के कुछ संस्करणों में पंक्तियों की एक जादुई संख्या है जो समस्या का कारण बनेगी। मैं आमतौर पर लगभग 100 पंक्तियों के लिए जाता हूं - समूहीकरण के अधिकांश लाभ प्राप्त करने के लिए पर्याप्त है, लेकिन पार्सिंग बग से बचने के लिए पर्याप्त कम है। या...
- कोशिश करें
insert into ... select ... from dual union all ...
इसके बजाय विधि। यह आमतौर पर बहुत तेजी से चलता है, हालांकि इसका पार्सिंग प्रदर्शन आकार के साथ काफी कम हो सकता है। - ओरेकल को अपग्रेड करें। नए संस्करणों में पार्सिंग प्रदर्शन में सुधार हुआ है। मैं अब इस मुद्दे को संस्करण 12.2 में पुन:पेश नहीं कर सकता।
चेतावनी
इससे गलत सबक मत सीखो। यदि आप SQL प्रदर्शन के बारे में चिंतित हैं, तो 99% बार आप समान चीजों को अलग-अलग करने के बजाय एक साथ समूहबद्ध करना बेहतर समझते हैं। आप चीजों को सही तरीके से कर रहे हैं, आप बस एक अजीब बग में भाग गए। (मैंने माई ओरेकल सपोर्ट खोजा लेकिन इसके लिए कोई आधिकारिक बग नहीं मिला।)