अपडेट करें:
मेरे ब्लॉग में यह आलेख मेरे उत्तर और मेरी टिप्पणियों दोनों को अन्य उत्तरों में सारांशित करता है, और वास्तविक निष्पादन योजनाओं को दिखाता है:
SELECT *
FROM a
WHERE a.c IN (SELECT d FROM b)
SELECT a.*
FROM a
JOIN b
ON a.c = b.d
ये प्रश्न समकक्ष नहीं हैं। यदि आपकी तालिका b
. है तो वे भिन्न परिणाम प्राप्त कर सकते हैं कुंजी संरक्षित नहीं है (यानी b.d
. के मान अद्वितीय नहीं हैं)।
पहली क्वेरी के समतुल्य निम्नलिखित है:
SELECT a.*
FROM a
JOIN (
SELECT DISTINCT d
FROM b
) bo
ON a.c = bo.d
अगर b.d
UNIQUE
है और इस तरह चिह्नित किया गया है (UNIQUE INDEX
. के साथ) या UNIQUE CONSTRAINT
), तो ये प्रश्न समान हैं और संभवतः समान योजनाओं का उपयोग करेंगे, क्योंकि SQL Server
इसे ध्यान में रखने के लिए पर्याप्त स्मार्ट है।
SQL Server
इस क्वेरी को चलाने के लिए निम्न विधियों में से एक का उपयोग कर सकते हैं:
-
अगर
a.c
. पर कोई इंडेक्स है ,d
UNIQUE
है औरb
a
. की तुलना में अपेक्षाकृत छोटा है , तब स्थिति को सबक्वेरी और प्लेनINNER JOIN
में प्रचारित किया जाता है उपयोग किया जाता है (b
. के साथ) अग्रणी) -
यदि
b.d
. पर कोई अनुक्रमणिका है तो औरd
UNIQUE
नहीं है , तो शर्त भी प्रचारित हो जाती है औरLEFT SEMI JOIN
प्रयोग किया जाता है। इसका उपयोग उपरोक्त स्थिति के लिए भी किया जा सकता है। -
यदि
b.d
. दोनों पर कोई अनुक्रमणिका है तो औरa.c
और वे बड़े हैं, फिरMERGE SEMI JOIN
उपयोग किया जाता है -
अगर किसी टेबल पर कोई इंडेक्स नहीं है, तो
b
. पर एक हैश टेबल बनाई जाती है औरHASH SEMI JOIN
उपयोग किया जाता है।
न तो इन विधियों में से प्रत्येक बार पूरी सबक्वेरी का पुनर्मूल्यांकन करता है।
यह कैसे काम करता है, इस बारे में अधिक विवरण के लिए मेरे ब्लॉग में इस प्रविष्टि को देखें:
सभी RDBMS
. के लिए लिंक हैं बड़े चार में से।