2012-02-28 11 views
28

कहें कि कोई आपके पास आया और कहा कि हम एसक्यूएल की मात्रा को कम करने जा रहे हैं जिसे हम 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 हमेशा अच्छे इरादों (कम से कम इन भागों में) के साथ शुरू होता है।

+0

वे बराबर होना चाहिए। सुनिश्चित करने के लिए निष्पादन योजना पर एक नज़र डालें। –

+0

मुझे लगता है कि इस पर ध्यान केंद्रित करने के लिए और अधिक उचित शैली की चीजें हैं, जैसे टेबल उपनाम, 'चयन *' का उपयोग न करें। क्वेरी प्लान एकमात्र चीज है जो आपको बताएगी कि अनुकूलक क्या देखता है, और यह इसके आधार पर बदल सकता है इंडेक्स और आंकड़े। –

+0

मैंने 6 मिलियन पंक्तियों की मेज पर परीक्षण किया है। और प्रभावित पंक्तियां 150 हजार पंक्तियां हैं।प्रतिक्रिया सभी एक ही हैं। – shenhengbin

उत्तर

21

दोनों एक ही निष्पादन योजना का उत्पादन करेंगे - या तो table scan, index scan, या index seek, इस पर निर्भर करता है कि आपकी तालिका अनुक्रमित है या नहीं।

आप अपने लिए देख सकते हैं - Displaying Graphical Execution Plans (SQL Server Management Studio) - "निष्पादन योजना विकल्प का उपयोग" नामक अनुभाग देखें।

15

उन दो निर्दिष्ट कथन अनुकूलक (आप निष्पादन योजनाओं की तुलना किया?) के बराबर हैं, लेकिन मुझे लगता है कि और अधिक महत्वपूर्ण लाभ यदि आप बाद से बाहर निकलना है कि

WHERE id = 1 OR id = 2 OR id = 3 OR id = 4 OR id = 5 

के रूप में व्यक्त किया जा सकता है है निम्नलिखित, और अधिक संक्षिप्त और पठनीय (लेकिन शब्दार्थ अनुकूलक के बराबर) संस्करण:

WHERE id IN (1,2,3,4,5) 

समस्या है जब के रूप में व्यक्त बाद ज्यादातर लोगों को लगता है कि वे @list = '1,2,3,4,5' की तरह, एक स्ट्रिंग पारित और फिर कर सकते हैं कहते हैं:

WHERE id IN (@list) 

इसका कारण यह है @list एक भी अदिश स्ट्रिंग, और नहीं पूर्णांकों की एक सरणी है काम नहीं करता।

उन मामलों के लिए जहां आपके पास एक मूल्य है, मैं नहीं देखता कि "अनुकूलन" कुछ भी कैसे मदद करता है। आपने कम एसक्यूएल नहीं लिखा है, आपने वास्तव में और लिखा है। क्या आप अधिक विस्तार से रेखांकित कर सकते हैं कि यह कम एसक्यूएल कैसे जा रहा है?

+0

अभी मेरे पास SQL ​​सर्वर नहीं है। आगे बढ़ने से पहले मुझे SQL सर्वर दुनिया से एक राय चाहिए। यानी एक संवेदना जांच के बिना इस तरह एक डीबीएमएस विशिष्ट परिवर्तन नहीं करना चाहता था। बहुत बहुत धन्यवाद। – sgtz

+0

फिर भी दूसरों के साथ सहमत हैं कि बदलने के लिए एक तार्किक बात प्रतीत नहीं होती है, उद्देश्य क्या है? समकक्ष वाक्यविन्यास के बीच उस वैकल्पिक पर ध्यान केंद्रित करने के लिए और अधिक महत्वपूर्ण चीजें नहीं हैं? –

+0

पुन: कम एसक्यूएल। कहें कि बयान बहुत सारे जुड़ाव के साथ काफी बड़ा है। इसमें कम एसक्यूएल होगा क्योंकि पूरा ब्लॉक डुप्लिकेट नहीं किया जाएगा, और आपको या तो गतिशील संरचना की आवश्यकता नहीं होगी। – sgtz

संबंधित मुद्दे