2011-06-30 15 views
7

मेरे पास बहुत बुरी तरह से प्रदर्शन एसक्यूएल क्वेरी है। मैंने टेबल पर किए गए इनर जॉइन में इसे ट्रैक किया। बदलने से इस में शामिल होने के बाईं ओर काफी (6 मिनट 20 सेकंड से) प्रदर्शन बढ़ जाती है - अब मैं जानता हूँ 2 समतुल्य नहीं कर रहे हैं, लेकिन ... यहाँ मैं क्याएसक्यूएल आंतरिक बनाम बाएं प्रश्न में शामिल हों

SELECT * 
    FROM SomeTable ST 
    JOIN BigTable BT ON BT.SomeID = ST.SomeID 
        AND BT.Something = ST.Something 
        AND BT.AnotherValue = '123' 

पूछ रहा हूँ में शामिल होने के बाद से अतिरिक्त मापदंड हैं (है और कुछ = कुछ) - एक ही परिणाम के उत्पादन में शामिल होने के बावजूद इसे बदल रहा है - लेकिन बहुत तेज़?

लौटाए गए परिणाम एक ही छोड़ दिया काफी तेजी से किया जा रहा के साथ छोड़ दिया/इनर का उपयोग कर रहे हैं ...

+0

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

+0

वाईयूपी, मैं हमेशा के रूप में उलझन में हूं - तार्किक पढ़ता लाखों (कई लाख) – user822150

+0

द्वारा बूंदों को छोड़ देता है क्या आप दोनों के लिए निष्पादन योजना पोस्ट कर सकते हैं? – Thilo

उत्तर

2

यह भीतरी दूसरी तरह के आसपास एक बेहतर प्रदर्शन देना होगा शामिल हो कर की तरह लग रहा ...

SELECT 
    * 
FROM 
    BigTable AS BT 
INNER JOIN 
    SomeTable AS ST 
ON 
    BT.AnotherValue = '123' 
AND 
    BT.SomeID = ST.SomeID 
AND 
    BT.Something = ST.Something 

या सबक्वेरी

SELECT 
    * 
FROM 
    (SELECT * FROM BigTable WHERE AnotherValue = '123') AS BT 
INNER JOIN 
    SomeTable AS ST 
AND 
    BT.SomeID = ST.SomeID 
AND 
    BT.Something = ST.Something 

इसके अलावा के साथ, सुनिश्चित करें कि BigTable.AnotherValue समुचित रूप से सूचीबद्ध किया गया है।

0

जबकि आप दोनों से एक ही परिणाम प्राप्त कर रहे हैं यह समझने के लिए महत्वपूर्ण है कि एक बाएं शामिल एक आंतरिक शामिल होने से अलग है।

एक बाएं में शामिल होने भले ही सही तालिका में कोई मिलान हैं बायां तालिका से सभी पंक्तियों को ले जाएगा।

SQL LEFT JOIN बनाम SQL INNER JOIN

तो अपने डेटा सिर्फ एक तरह से कि दिए गए दो अलग-अलग मिलती समान है में उत्पादन किया जा करने के लिए होता है।

SELECT * 
    FROM SomeTable ST 
    JOIN BigTable BT ON BT.SomeID = ST.SomeID 
        AND BT.Something = ST.Something 
        AND BT.AnotherValue = '123' 

कैसे इस बारे में:

SELECT 
    * 
FROM 
    SomeTable 
     INNER JOIN 
    BigTable 
     ON SomeTable.PreferedPrimaryKey = BigTable.PreferAForeignKey 
     AND SomeTable.SomethingThatIsIndexedAndPreferableNumeric = BigTable.SomethingThatIsIndexedAndPreferableNumeric 
WHERE 
    BigTable.AnotherValue = '123' 

अपने अनुक्रमित की जाँच करें और एक गैर अनुक्रमित चरित्र स्ट्रिंग नहीं है में शामिल होने के दूसरे भाग के लिए सुनिश्चित करें कि आपके मापदंड बनाते हैं।

+1

आप एक विश्वसनीय स्रोत के रूप में w3schools का उपयोग नहीं करते हैं। कभी नहीँ। यही उन्होंने मुझे बताया। – user194076

+0

मुझे नहीं पता कि आपने w3schools के बारे में यह कहां सुना है, लेकिन एसक्यूएल जुड़ने कई दशकों से आसपास रहे हैं और कई डेटाबेस में लागू किए गए हैं। उन्हें शायद यह अधिकार मिला। – JeffO

+0

यह सही है। वास्तव में यह सब मायने रखता है। –

संबंधित मुद्दे