आम तौर पर, आप केवल दो तालिकाओं में शामिल हो जाते हैं।
FOR some_cursor IN (SELECT s.col1,
s.col2
FROM sometable s
JOIN temp_table t ON (s.col3 = t.col1))
LOOP
<<do something>>
END LOOP
चूंकि आप दक्षता के बारे में चिंतित हैं, हालांकि
- है
TEMP_TABLE
वास्तव में एक अस्थायी तालिका? यदि हां, तो क्यों ? यह अत्यंत दुर्लभ है कि Oracle को वास्तव में अस्थायी तालिकाओं का उपयोग करने की आवश्यकता होती है जिससे मुझे संदेह होता है कि आप शायद अस्थायी तालिका को पहली जगह में पॉप्युलेट करने के लिए कुछ अक्षम कर रहे हैं। - आपके पास एक कर्सर क्यों है
FOR
TEMP_TABLE
. से डेटा संसाधित करने के लिए लूप ? पंक्ति-दर-पंक्ति प्रसंस्करण पीएल/एसक्यूएल में कुछ भी करने का सबसे धीमा तरीका है, इसलिए यदि आप दक्षता के बारे में चिंतित हैं तो इसे आम तौर पर टाला जाएगा। एक प्रदर्शन के दृष्टिकोण से, आप SQL को अधिकतम करना चाहते हैं ताकि एक लूप करने के बजाय जो एकल-पंक्तिINSERT
की एक श्रृंखला करता है याUPDATE
संचालन, आप एक हीINSERT
करेंगे याUPDATE
जिसने पंक्तियों के पूरे सेट को संशोधित किया। यदि आपको वास्तव में डेटा को टुकड़ों में संसाधित करने की आवश्यकता है, तो पीएल/एसक्यूएल संग्रह और थोक प्रसंस्करण चलेंगे लेकिन यह सीधे एसक्यूएल के रूप में कुशल नहीं होगा। - आपके पास
DISTINCT
क्यों है?TEMP_TABLE
. के विरुद्ध आपकी क्वेरी में ? क्या आप वाकई उम्मीद करते हैं कि डुप्लिकेटbig_id
होगा मूल्य जो गलत नहीं हैं? अधिकांश समय, लोगDISTINCT
. का उपयोग करते हैं गलत तरीके से या तो उन समस्याओं को कवर करने के लिए जहां डेटा को गलत तरीके से जोड़ा गया है या जहां आप ओरेकल को एक महंगा सॉर्ट करने के लिए मजबूर कर रहे हैं, अगर भविष्य में गलत डेटा बन जाता है जब एक बाधा खुद को बचाने के लिए अधिक उपयुक्त तरीका होगा।