2008-09-22 15 views
11

मेरे पास कार्य और नोट्स वाली दो तालिकाएं हैं, और प्रत्येक के लिए संबंधित नोट्स की संख्या के साथ कार्यों की एक सूची पुनर्प्राप्त करना चाहते हैं। इन दो प्रश्नों काम करते हैं:ट्रांजैक्ट-एसक्यूएल - उप क्वेरी या बाएं-शामिल?

select t.TaskId, 
     (select count(n.TaskNoteId) from TaskNote n where n.TaskId = t.TaskId) 'Notes' 
from Task t 

-- or 
select t.TaskId, 
     count(n.TaskNoteId) 'Notes' 
from Task t 
left join 
     TaskNote n 
on  t.TaskId = n.TaskId 
group by t.TaskId

उन दोनों के बीच एक अंतर है और मैं एक दूसरे के ऊपर का उपयोग करना चाहिए, या वे एक ही काम करने का सिर्फ दो तरीके हैं? धन्यवाद।

उत्तर

12

छोटे डेटासेट पर जब प्रदर्शन की बात आती है तो वे धोते हैं। अनुक्रमित होने पर, LOJ थोड़ा बेहतर होता है।

मुझे बड़े डेटासेट्स पर मिला है जो एक आंतरिक जुड़ता है (एक आंतरिक जुड़ाव भी काम करेगा।) एक बहुत बड़े कारक (क्षमा करें, कोई संख्या नहीं) द्वारा सबक्वायरी को बेहतर प्रदर्शन करेगा।

+0

आंतरिक जुड़ने पर डितो - मैंने देखा है कि बड़े सेट पर एक बड़ा अंतर है (यह मानते हुए कि यह सही व्यवहार है जिसे आप चाहते हैं, और आपको एक ISNULL() या इसी तरह के फ़ंक्शन का उपयोग करने की आवश्यकता हो सकती है) –

0

आप या तो उपयोग कर सकते हैं, और वे अर्थात् समान हैं। आम तौर पर, अंगूठे का नियम उपयोग करना आपके लिए जो भी फ़ॉर्म आसान होता है, जब तक प्रदर्शन एक मुद्दा न हो।

यदि प्रदर्शन एक मुद्दा है, तो अन्य फॉर्म का उपयोग कर क्वेरी को फिर से लिखने के साथ प्रयोग करें। कभी-कभी अनुकूलक एक फॉर्म के लिए एक सूचकांक का उपयोग करेगा, न कि दूसरे।

1

इस पर कोई स्पष्ट जवाब नहीं है। आपको एसक्यूएल प्लान देखना चाहिए। संबंधपरक बीजगणित के मामले में, वे अनिवार्य रूप से समकक्ष हैं।

6

ज्यादातर मामलों में, अनुकूलक उनका इलाज करेगा।

मुझे दूसरा पसंद है, क्योंकि इसमें कम घोंसले हैं, जिससे इसे पढ़ने और आसानी से बनाए रखना आसान हो जाता है। मैंने घोंसले को कम करने के लिए SQL सर्वर की सामान्य तालिका अभिव्यक्तियों का उपयोग करना शुरू कर दिया है।

इसके अलावा, दूसरा वाक्य रचना अधिक लचीला है अगर वहाँ आगे समुच्चय जो अधिकतम COUNT, मिन (some_scalar), मैक्स(), औसत() आदि जैसे

2

अगर अलावा भविष्य में जोड़ा जा सकता है आप SQL सर्वर प्रबंधन स्टूडियो का उपयोग कर रहे हैं, आप क्वेरी संस्करण में दोनों संस्करणों को दर्ज कर सकते हैं और फिर राइट-क्लिक करें और प्रदर्शन अनुमानित निष्पादन योजना का चयन करें। यह आपको बैच के सापेक्ष दो प्रतिशत लागत देगा। यदि उन्हें एक ही समय लेने की उम्मीद है, तो वे दोनों 50% के रूप में दिखाए जाएंगे - इस मामले में, जो भी आप अन्य कारणों से पसंद करते हैं (पढ़ने के लिए आसान, बनाए रखने में आसान, आपके कोडिंग मानकों के साथ बेहतर फिट) चुनें। अन्यथा, आप बैच के सापेक्ष निम्न प्रतिशत लागत वाले व्यक्ति को चुन सकते हैं।

आप एक ही तकनीक का उपयोग करके दो संस्करणों की तुलना करके प्रदर्शन को बेहतर बनाने के लिए किसी भी क्वेरी को बदलने के लिए एक ही तकनीक का उपयोग कर सकते हैं।

बेशक, क्योंकि यह बैच के सापेक्ष एक लागत है, इसका मतलब यह नहीं है कि या तो क्वेरी जितनी तेज हो सकती है - यह सिर्फ आपको बताती है कि वे एक दूसरे से तुलना कैसे करते हैं, कुछ वास्तविक इष्टतम क्वेरी के लिए नहीं एक ही परिणाम प्राप्त करें।

5

सबक्वायरी धीमी हो जाएगी क्योंकि इसे बाहरी क्वेरी में प्रत्येक पंक्ति के लिए निष्पादित किया जा रहा है। जुड़ना तेज होगा क्योंकि यह एक बार किया जाता है। मेरा मानना ​​है कि क्वेरी ऑप्टिमाइज़र इस क्वेरी प्लान को फिर से लिख नहीं पाएगा क्योंकि यह समानता को पहचान नहीं सकता है।

आम तौर पर आप इस प्रकार की गिनती के लिए एक समूह और समूह करेंगे। आपके द्वारा दिखाए गए प्रकार की सहसंबंधित उप-मुख्यताओं में मुख्य रूप से रुचि है यदि उन्हें किसी तालिका में कुछ समूह या अधिक जटिल भविष्यवाणी करना है जो किसी अन्य शामिल होने में भाग नहीं ले रहा है।

1

मैं जहां भी संभव हो वहां सबक्वायरी से बचने के लिए इसे एक बिंदु बना देता हूं। आम तौर पर शामिल होना अधिक कुशल होगा।

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