Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

IN बनाम JOIN बड़े रोसेट के साथ

अपडेट करें:

मेरे ब्लॉग में यह आलेख मेरे उत्तर और मेरी टिप्पणियों दोनों को अन्य उत्तरों में सारांशित करता है, और वास्तविक निष्पादन योजनाओं को दिखाता है:

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 . के लिए लिंक हैं बड़े चार में से।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ग्रुप बाय को उल्टा/ब्लो आउट करें

  2. Java7 sqljdbc4 - SQL त्रुटि 08S01 getConnection पर ()

  3. एक से अधिक कॉलम के लिए क्रॉस अप्लाई का उपयोग करना

  4. SQL सर्वर क्वेरी प्रत्येक उप-समूह से 1 का चयन करें

  5. SQL सर्वर डेटाबेस आकार का चयन करें