मेरे पास एक मामला है जहां एक JOIN या IN का उपयोग करने से मुझे सही परिणाम मिलेंगे ... जिसमें आमतौर पर बेहतर प्रदर्शन होता है और क्यों? यह निर्भर करता है कि आप किस डेटाबेस सर्वर पर चल रहे हैं? (FYI करें मैं MSSQL का उपयोग कर रहा हूं)
मेरे पास एक मामला है जहां एक JOIN या IN का उपयोग करने से मुझे सही परिणाम मिलेंगे ... जिसमें आमतौर पर बेहतर प्रदर्शन होता है और क्यों? यह निर्भर करता है कि आप किस डेटाबेस सर्वर पर चल रहे हैं? (FYI करें मैं MSSQL का उपयोग कर रहा हूं)
जवाबों:
आम तौर पर बोलना, IN
और JOIN
विभिन्न प्रश्न हैं जो अलग-अलग परिणाम दे सकते हैं।
SELECT a.*
FROM a
JOIN b
ON a.col = b.col
जैसा है वैसा नहीं है
SELECT a.*
FROM a
WHERE col IN
(
SELECT col
FROM b
)
, जब तक b.col
अद्वितीय न हो।
हालाँकि, यह पहली क्वेरी का पर्याय है:
SELECT a.*
FROM a
JOIN (
SELECT DISTINCT col
FROM b
)
ON b.col = a.col
यदि ज्वाइनिंग कॉलम ऐसा है UNIQUE
और इस तरह से चिह्नित किया गया है, तो ये दोनों क्वेरीज़ एक ही प्लान में हैं SQL Server
।
यदि ऐसा नहीं है, तो IN
तेजी से है JOIN
पर DISTINCT
।
प्रदर्शन विवरण के लिए मेरे ब्लॉग में इस लेख को देखें:
IN
तात्पर्य है DISTINCT
। SQL Server
यह नोटिस करने के लिए पर्याप्त स्मार्ट है, और दोनों प्रश्नों के लिए एक ही योजना उत्पन्न करेगा। यकीन नहीं, हालांकि, अन्य कैसे RDBMS
व्यवहार करेंगे।
मजेदार बात यह है कि, मैंने इस विषय पर एक ब्लॉग पोस्ट किया था।
देखें ओरेकल बनाम MySQL एसक्यूएल सर्वर बनाम: एकत्रीकरण बनाम शामिल
संक्षिप्त उत्तर: आपको इसका परीक्षण करना है और अलग-अलग डेटाबेस बहुत भिन्न होते हैं।
यह कहना मुश्किल है - वास्तव में यह पता लगाने के लिए कि कौन सा बेहतर काम करता है, आपको वास्तव में निष्पादन समय की रूपरेखा तैयार करनी होगी।
अंगूठे के एक सामान्य नियम के रूप में, मुझे लगता है कि यदि आपके पास आपके विदेशी कुंजी कॉलम पर सूचकांक हैं, और यदि आप केवल (या अधिकतर) ININ JOIN शर्तों का उपयोग कर रहे हैं, तो JOIN थोड़ा और तेज़ होगा।
लेकिन जैसे ही आप OUTER JOIN का उपयोग करना शुरू करते हैं, या यदि आपके पास विदेशी कुंजी इंडेक्स की कमी है, तो IN जल्दी हो सकता है।
न घुलनेवाली तलछट
तार्किक अंतरों पर एक दिलचस्प राइटअप: SQL सर्वर: JOIN vs IN EXISTS - तार्किक अंतर
मुझे पूरा यकीन है कि यह मानते हुए कि संबंध और अनुक्रमित बनाए रखा जाता है एक जुड़ें बेहतर समग्र प्रदर्शन करेंगे (अधिक प्रयास उस ऑपरेशन के साथ काम करने में चला जाता है: अन्य)। यदि आप इसके बारे में वैचारिक रूप से सोचते हैं तो 2 प्रश्नों और 1 क्वेरी के बीच का अंतर।
आपको इसे क्वेरी एनालाइज़र पर हुक करने की आवश्यकता है और इसे आज़माएं और अंतर देखें। क्वेरी निष्पादन योजना को भी देखें और चरणों को कम करने का प्रयास करें।
यह थ्रेड बहुत पुराना है लेकिन फिर भी अक्सर इसका उल्लेख किया जाता है। मेरे व्यक्तिगत स्वाद के लिए यह थोड़ा अधूरा है, क्योंकि EXISTS कीवर्ड के साथ डेटाबेस को पूछने का एक और तरीका है जो मुझे अधिक बार नहीं की तुलना में तेजी से मिला।
इसलिए यदि आप केवल तालिका के मानों में रुचि रखते हैं, तो आप इस क्वेरी का उपयोग कर सकते हैं:
SELECT a.*
FROM a
WHERE EXISTS (
SELECT *
FROM b
WHERE b.col = a.col
)
यदि कर्नल को अनुक्रमित नहीं किया जाता है, तो अंतर बहुत बड़ा हो सकता है, क्योंकि डीबी को बी में सभी रिकॉर्ड नहीं ढूंढने पड़ते हैं, जिसका कोल में समान मूल्य है, इसे केवल पहले एक को खोजना होगा। यदि b.col पर कोई इंडेक्स नहीं है और बीए टेबल स्कैन में बहुत सारे रिकॉर्ड परिणाम हो सकते हैं। IN या JOIN के साथ यह एक पूर्ण टेबल स्कैन होगा, EXISTS के साथ यह केवल एक आंशिक टेबल स्कैन होगा (जब तक कि पहला मिलान रिकॉर्ड नहीं मिलता है)।
यदि बी में बहुत सारे रिकॉर्ड हैं, जो एक ही कोल वैल्यू है, तो आप इन सभी रिकॉर्ड को अस्थायी स्थान में पढ़ने के लिए बहुत सारी मेमोरी बर्बाद कर देंगे, ताकि यह पता चल सके कि आपकी स्थिति संतुष्ट है। मौजूद होने से इसे आमतौर पर टाला जा सकता है।
मैंने अक्सर EXISTS को तेजी से पाया है फिर भी यदि कोई इंडेक्स है। यह डेटाबेस सिस्टम (ऑप्टिमाइज़र) पर निर्भर करता है, डेटा और कम से कम उस इंडेक्स के प्रकार पर जिसका उपयोग किया जाता है।
प्रत्येक डेटाबेस का कार्यान्वयन लेकिन आप शायद अनुमान लगा सकते हैं कि वे सभी समान तरीके से कम या ज्यादा सामान्य समस्याओं को हल करते हैं। यदि आप MSSQL का उपयोग कर रहे हैं, तो निष्पादन योजना पर एक नज़र है जो उत्पन्न होती है। आप प्रोफाइलर को चालू करके और योजनाओं को निष्पादित करके ऐसा कर सकते हैं। कमांड चलाने पर यह आपको एक टेक्स्ट वर्जन देगा।
मुझे यकीन नहीं है कि आप MSSQL के किस संस्करण का उपयोग कर रहे हैं, लेकिन आप क्वेरी विश्लेषक में SQL Server 2000 में एक ग्राफिकल प्राप्त कर सकते हैं। मुझे यकीन है कि बाद के संस्करणों में SQL सर्वर स्टूडियो प्रबंधक में यह कार्यक्षमता कुछ गुप्त है।
एक्साइज प्लान पर एक नजर। जहां तक संभव हो टेबल स्कैन से बचें, जब तक कि आपकी टेबल छोटी न हो, उस स्थिति में टेबल स्कैन इंडेक्स का उपयोग करने से अधिक तेज होता है। अलग-अलग जॉइन ऑपरेशंस पर पढ़ें जो प्रत्येक अलग-अलग परिदृश्य का निर्माण करते हैं।
ऑप्टिमाइज़र पर्याप्त स्मार्ट होना चाहिए ताकि आपको सामान्य प्रश्नों के लिए समान परिणाम मिल सके। निष्पादन योजना की जांच करें और उन्हें आपको वही चीज देनी चाहिए। यदि वे नहीं करते हैं, तो मैं आम तौर पर जॉइन को तेज होने पर विचार करूंगा। हालाँकि, सभी प्रणालियाँ भिन्न हैं, इसलिए आपको यह सुनिश्चित करने के लिए अपने सिस्टम के कोड को प्रोफाइल करना चाहिए।