sql - अंदरूनी जॉइन बनाम इनर जॉइन(चुनें। से)




sql-server join (3)

आपने क्वेरी प्लान से जांच करके सही काम किया है। लेकिन मेरे पास संस्करण 2 में 100% आत्मविश्वास है। यह तेज है जब रिकॉर्ड्स की संख्या बहुत अधिक है।

मेरे डेटाबेस में लगभग 1,000,000 रिकॉर्ड हैं और यह बिल्कुल परिदृश्य है जहां क्वेरी योजना दोनों प्रश्नों के बीच अंतर दिखाती है। इसके अलावा, जहां खंड का उपयोग करने के बजाय, यदि आप इसे स्वयं शामिल होने में उपयोग करते हैं, तो यह क्वेरी को तेज़ी से बनाता है:
चुनें p.Name, s.OrderQty
उत्पाद पी से
INNER जॉइन (चुनें उत्पाद आईडी, salesOrderDetail से ऑर्डरक्टी) p.ProductID = s.ProductID पर p.isactive = 1

इस क्वेरी का बेहतर संस्करण है:

चुनें p.Name, s.OrderQty
उत्पाद पी से
INNER जॉइन (चुनें उत्पाद आईडी, salesOrderDetail से ऑर्डरक्टी) p.ProductID = s.ProductID और p.isactive = 1 पर है

(मान लीजिए निष्क्रिय उत्पाद उत्पाद तालिका में एक क्षेत्र है जो सक्रिय / निष्क्रिय उत्पादों का प्रतिनिधित्व करता है)।

क्या एक ही प्रश्न के इन दो संस्करणों के बीच प्रदर्शन के मामले में कोई अंतर है?

--Version 1
SELECT p.Name, s.OrderQty
FROM Product p
INNER JOIN SalesOrderDetail s on p.ProductID = s.ProductID

--Version 2
SELECT p.Name, s.OrderQty
FROM Product p
INNER JOIN (SELECT ProductID, OrderQty FROM SalesOrderDetail) s on p.ProductID = s.ProductID

मैंने यह सुना है (एक डीबीए द्वारा) कि संस्करण 2 तेज है क्योंकि यह आंतरिक चयन कथन के भीतर, क्वेरी के लिए आवश्यक कॉलम केवल प्राप्त करता है। लेकिन यह समझ में नहीं आता है, क्योंकि क्वेरी प्रदर्शन (जैसा कि मुझे पता है) प्रभावित पंक्तियों की संख्या और वापस कॉलम की अंतिम सूची पर आधारित है।

दोनों के लिए पूछताछ योजना समान हैं, इसलिए मुझे लगता है कि दोनों के बीच कोई अंतर नहीं है।

क्या मैं सही हूँ?


ऐसा लगता है कि SQL सर्वर क्वेरी को पढ़ने की कोशिश नहीं करेगा, जो क्वेरी के लिए आवश्यक नहीं है, ऑप्टिमाइज़र पर्याप्त चालाक है

जटिल समझ में शामिल होने पर यह समझ में आ सकता है (यानी जो जिंग्स, ग्रुपिंग इत्यादि हैं) तो, हाँ, आवश्यक फ़ील्ड निर्दिष्ट करना बेहतर है।

लेकिन एक और मुद्दा है। यदि क्वेरी सरल है तो इसमें कोई फर्क नहीं पड़ता है, लेकिन प्रदर्शन में सुधार करने के लिए हर अतिरिक्त कार्रवाई भी होती है, जिससे अनुकूलक कड़ी मेहनत करता है और अनुकूलक समय में सबसे अच्छी योजना पाने में असफल हो सकता है और इष्टतम क्वेरी नहीं चलाएगा। तो अतिरिक्त चयन ऐसी क्रिया हो सकती है जो प्रदर्शन को भी कम कर सकती है


बहुत अंतर नहीं होगा। होवर संस्करण 2 आसान होता है जब आपके पास कुछ गणना, एकत्रीकरण इत्यादि होती है जिसे इसके बाहर शामिल किया जाना चाहिए

--Version 2 
SELECT p.Name, s.OrderQty 
FROM Product p 
INNER JOIN 
(SELECT ProductID, SUM(OrderQty) as OrderQty FROM SalesOrderDetail GROUP BY ProductID
HAVING SUM(OrderQty) >1000) s 
on p.ProductID = s.ProdctId 






inner-join