कहें कि कोई आपके पास आया और कहा कि हम एसक्यूएल की मात्रा को कम करने जा रहे हैं जिसे हम IN
के बराबर बराबर बदलकर लिखते हैं। उपयोग एकल स्केलर मानों और संख्याओं की सूचियों दोनों के लिए होगा।एसक्यूएल स्टेटमेंट्स बनाम बराबर बनाम
SELECT *
FROM table
WHERE id = 1
या
SELECT *
FROM table
WHERE id IN (1)
इन बयान क्या अनुकूलक का उत्पादन के बराबर हैं?
यह सतह पर वास्तव में सरल दिखता है, लेकिन यह दो कारणों से सरलीकरण की ओर जाता है: 1. एसक्यूएल के बड़े ब्लॉक को डुप्लीकेट करने की आवश्यकता नहीं है, और 2. हम गतिशील एसक्यूएल का उपयोग नहीं करते हैं।
यह एक संक्षिप्त उदाहरण है, लेकिन निम्नलिखित पर विचार करें।
select a.* from tablea a
join tableb b on a.id = b.id
join tablec c on b.id2 = c.id2
left join tabled d on c.id3 = c.id3
where d.type = 1
... और एक से अधिक मामले
select a.* from tablea a
join tableb b on a.id = b.id
join tablec c on b.id2 = c.id2
left join tabled d on c.id3 = c.id3
where d.type in (1,2,3,4)
के लिए फिर से वही (यह भी एक बड़ी बयान नहीं है)
क़यास आप स्ट्रिंग संयोजन कर सकता है, लेकिन यह ओआरएम उपयोग के प्रकाश में वांछनीय नहीं है, और गतिशील एसक्यूएल स्ट्रिंग concatenation हमेशा अच्छे इरादों (कम से कम इन भागों में) के साथ शुरू होता है।
वे बराबर होना चाहिए। सुनिश्चित करने के लिए निष्पादन योजना पर एक नज़र डालें। –
मुझे लगता है कि इस पर ध्यान केंद्रित करने के लिए और अधिक उचित शैली की चीजें हैं, जैसे टेबल उपनाम, 'चयन *' का उपयोग न करें। क्वेरी प्लान एकमात्र चीज है जो आपको बताएगी कि अनुकूलक क्या देखता है, और यह इसके आधार पर बदल सकता है इंडेक्स और आंकड़े। –
मैंने 6 मिलियन पंक्तियों की मेज पर परीक्षण किया है। और प्रभावित पंक्तियां 150 हजार पंक्तियां हैं।प्रतिक्रिया सभी एक ही हैं। – shenhengbin