कौन सा बेहतर है: कई सम्मिलित हों या कई स्थितियाँ कहाँ हैं?


13

मैं दो प्रश्नों की तुलना करने की कोशिश कर रहा हूं:

क्वेरी 1:

SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a
WHERE tableA.b=tableB.b AND tableA.c=tableB.c  AND tableA.d=tableB.d  AND tableA.e=tableB.e 

क्वेरी 2:

SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a AND tableA.b=tableB.b AND tableA.c=tableB.c  AND tableA.d=tableB.d  
WHERE tableA.e=tableB.e 

क्या मुझे यह कहने का अधिकार है कि ये दोनों प्रश्न समान परिणाम देते हैं?

इसके अलावा, क्या यह कहना सही है कि पहली क्वेरी एक बड़ी तालिका बनाती है जिसके लिए एक बड़ी WHEREस्थिति है; जबकि दूसरे मामले में हमारे पास एक छोटी निर्मित मेज है जिस पर साधारण WHEREको लागू किया जाता है।

यह मानते हुए कि परिणाम समान हैं, कौन सी क्वेरी को प्राथमिकता दी जानी चाहिए? क्या कोई स्पष्ट प्रदर्शन मुद्दा है?


3
नहीं, आप ऐसा नहीं कह रहे हैं। यह होगा कि अगर एक थे INNER JOIN, लेकिन इसके साथ LEFT JOINविभिन्न परिणाम लौटाएंगे। मूल रूप से, आपने WHEREअपनी दूसरी क्वेरी पर जो शर्तें जोड़ी JOININNER JOIN
थीं

आह अच्छा। आप जो कहते हैं, मैं उसका पालन करता हूं। यदि मैं INNER JOINप्रदर्शन पर अपने प्रश्न करने के लिए संपादित करता हूं तो क्या यह वैध है?
ज्योफ

4
INNER JOINs के लिए प्रदर्शन में कोई अंतर नहीं होना चाहिए। कहा कि, पठनीयता और आशय की उचित अभिव्यक्ति के लिए, आपको ONऔर में फ़िल्टर मापदंड में शामिल होने के मानदंड का उपयोग करना चाहिए WHERE
हारून बर्ट्रेंड

@ypercube सही है, मैं उस शर्त को याद किया।
लामक

जवाबों:


10

यदि हम मानते हैं कि आप INNER JOINइसके बजाय उपयोग करते हैं LEFT JOIN(जो आपके इरादे से प्रतीत होता है), ये दोनों प्रश्न कार्यात्मक रूप से समतुल्य हैं। क्वेरी ऑप्टिमाइज़र आपके WHEREक्लॉज़ और आपके FROMक्लॉज़ में मानदंड की समीक्षा और मूल्यांकन करेंगे और सबसे कुशल निष्पादन योजना तक पहुँचने के लिए क्वेरी प्लान बनाते समय इन सभी कारकों पर विचार करेंगे। यदि हम EXPLAINदोनों कथनों पर करते हैं, तो हमें एक ही परिणाम मिलता है:

क्वेरी 1 :

EXPLAIN
SELECT 
  tableA.ColA
  ,tableA.ColB
  ,tableA.ColC
  ,tableA.ColD
  ,tableA.ColE
FROM tableA
  JOIN tableB ON tableA.ColA=tableB.ColA
WHERE 
  tableA.ColB=tableB.ColB 
  AND tableA.ColC=tableB.ColC 
  AND tableA.ColD=tableB.ColD  
  AND tableA.ColE=tableB.ColE

[परिणाम] :

| ID | SELECT_TYPE |  TABLE | TYPE | POSSIBLE_KEYS |    KEY | KEY_LEN |    REF | ROWS |                          EXTRA |
------------------------------------------------------------------------------------------------------------------------
|  1 |      SIMPLE | tableA |  ALL |        (null) | (null) |  (null) | (null) |    1 |                                |
|  1 |      SIMPLE | tableB |  ALL |        (null) | (null) |  (null) | (null) |    1 | Using where; Using join buffer |

क्वेरी 2 :

EXPLAIN
SELECT 
  tableA.ColA
  ,tableA.ColB
  ,tableA.ColC
  ,tableA.ColD
  ,tableA.ColE
FROM tableA
  JOIN tableB ON tableA.ColA=tableB.ColA
  AND tableA.ColB=tableB.ColB 
  AND tableA.ColC=tableB.ColC 
  AND tableA.ColD=tableB.ColD  
WHERE
  tableA.ColE=tableB.ColE

[परिणाम] :

| ID | SELECT_TYPE |  TABLE | TYPE | POSSIBLE_KEYS |    KEY | KEY_LEN |    REF | ROWS |                          EXTRA |
------------------------------------------------------------------------------------------------------------------------
|  1 |      SIMPLE | tableA |  ALL |        (null) | (null) |  (null) | (null) |    1 |                                |
|  1 |      SIMPLE | tableB |  ALL |        (null) | (null) |  (null) | (null) |    1 | Using where; Using join buffer |

आप निम्न लिंक के साथ पूर्ण विवरण की समीक्षा कर सकते हैं। मैंने एक SQL 2008 उदाहरण भी बनाया ताकि आप तुलना कर सकें कि दो इंजन कैसे काम करते हैं (जो समान है):

MySQL क्वेरी उदाहरण

SQL 2008 क्वेरी उदाहरण (सुनिश्चित करें कि आप दोनों परिणामों के लिए 'निष्पादन योजना देखें')


आपके विस्तृत समाधान के लिए धन्यवाद। मैंने INNER JOINइसके बजाय कोशिश की LEFT JOINऔर मुझे समय के दसवें हिस्से में एक ही आउटपुट मिलता है। मुझे लगता है कि मुझे पता है कि मुझे समान आउटपुट क्यों मिलता है, लेकिन INNER JOINबेहतर प्रदर्शन क्यों होगा ?
ज्योफ

4
जैसा LEFT JOINकि एक बाहरी जुड़ाव है, यह सेट के पूर्ण रिटर्न पक्ष पर डेटा सेट को प्रतिबंधित नहीं कर सकता है और उस तालिका से सभी पंक्तियों को पुनः प्राप्त करने का प्रयास करेगा (इस मामले में, टेबलए)। यदि आप उपयोग करते हैं INNER JOIN, तो यह दोनों टेबल पर उस मापदंड का लाभ उठा सकता है और डेटा सेट को प्रतिबंधित कर सकता है, इस प्रकार तेजी से रिटर्न प्रदान करता है।
माइक फाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.