2013-07-12 5 views
6

एसक्यूएल सर्वर में जुड़ने के लिए टेबल चर के मुकाबले अस्थायी तालिकाओं क्यों तेज हैं?जुड़ने के लिए तालिका चर के मुकाबले अस्थायी तालिकाओं क्यों तेज हैं?

नोट: दोनों परिदृश्यों में तालिकाओं में पीके है, और तालिका पीके के माध्यम से अन्य "भौतिक" तालिकाओं के साथ जुड़ती हैं।

उत्तर

10

दोनों Tempdb में बने रहे हैं; हालांकि, प्रदर्शन समस्याएं खेलती हैं क्योंकि ऑप्टिमाइज़र तालिका चर पर आंकड़े बनाए रखता नहीं है। यह समस्याग्रस्त है क्योंकि अनुकूलक हमेशा यह मानने जा रहा है कि आपकी तालिका चर में 1 पंक्ति है। जाहिर है, यह वास्तव में एक प्रश्न योजना को खराब कर सकता है, खासकर जब आपकी तालिका चर में बहुत सारी पंक्तियां होती हैं। मैं 1000 या उससे अधिक पंक्तियों से अधिक कुछ स्टोर करने के लिए टेबल वैरिएबल का उपयोग नहीं करता; अन्यथा, प्रदर्शन अप्रत्याशित हो सकता है।

+5

तालिका चर के लिए कोई आंकड़े बनाए रखा नहीं है लेकिन पंक्ति गणना है। ऑप्टिमाइज़र आम तौर पर तालिका वैरिएबल कार्डिनिटी 0 पंक्तियों को मानता है क्योंकि तालिका परिवर्तनीय आबादी से पहले कथन संकलित किया जाता है। यदि कथन पुन: संकलित करने के अधीन है तो यह वास्तविक पंक्ति गणना का उपयोग कर सकता है। –

+0

इसका उदाहरण [यहां मेरे उत्तर के कार्डिनिटी अनुभाग] में शामिल है [http://dba.stackexchange.com/questions/16385/whats-the-difference-between-a-temp-table-and-table-variable-in -sql-सर्वर/16386 # 16386) –

4

टेम्पल टेबल टेबल के समान होते हैं लेकिन जब वे बनाए जाते हैं तो वे tempdb में स्टोर होते हैं, जिसका अर्थ है कि ऑप्टिमाइज़र उन पर आंकड़े बना सकता है, जबकि टेबल वैरिएबल चर के समान होते हैं और उनके बारे में कोई आंकड़े नहीं होते हैं। सामान्य रूप से टीएमपी टेबल बनाम तुलना करते समय टेबल चर, temp टेबल शीर्ष पर बाहर आते हैं। कारण यह है कि क्वेरी ऑप्टिमाइज़र कभी-कभी टेबल वर्रों के लिए खराब योजनाएं उत्पन्न करेगा। जब बहुत सारे डेटा होते हैं तो यह ज्यादातर देखा जा सकता है। सबसे बड़ा बिंदु मैं कर सकता हूं कि टेम्पलेट टेबल के लिए जेनरेट की गई योजनाओं की तुलना में टेबल वैरिएबल अप्रत्याशित निष्पादन योजनाओं की संभावना अधिक है। दूसरी तरफ Temp टेबल, अधिक recompilation का कारण बन जाएगा।

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