2010-02-24 8 views
22

कभी-कभी हम व्युत्पन्न तालिका और अस्थायी तालिका दोनों के साथ एक क्वेरी लिख सकते हैं। मेरा सवाल यह है कि कौन सा बेहतर है? क्यूं कर?किसके पास बेहतर प्रदर्शन है: व्युत्पन्न टेबल्स या अस्थायी सारणी

+0

@tableVariables के बारे में क्या ;-) –

+2

@ केएम: आप यहां भयानक ताकतों के साथ खेल रहे हैं। – Quassnoi

उत्तर

20

व्युत्पन्न तालिका एक तार्किक निर्माण है।

इसे tempdb में संग्रहीत किया जा सकता है, जिसे प्रत्येक बार एक्सेस किए जाने वाले अंतर्निहित कथन का पुनर्मूल्यांकन करके, या यहां तक ​​कि अनुकूलित भी किया जाता है।

अस्थायी तालिका एक भौतिक निर्माण है। यह tempdb में एक तालिका है जो मूल्यों के साथ बनाई और बनाई गई है।

कौन सा बेहतर है, उस तालिका पर निर्भर करता है, जिसका उपयोग तालिका में प्राप्त करने के लिए किया जाता है, और कई अन्य कारकों पर निर्भर करता है।

उदाहरण के लिए, CTE (सामान्य तालिका अभिव्यक्ति) SQL Server में (और शायद संभवतः) का उपयोग हर बार पुन: मूल्यांकन किया जा सकता है। इस क्वेरी:

WITH q (uuid) AS 
     (
     SELECT NEWID() 
     ) 
SELECT * 
FROM q 
UNION ALL 
SELECT * 
FROM q 

होगा सबसे शायद उपज दो अलग NEWID() की।

इस मामले में, एक अस्थायी तालिका का उपयोग किया जाना चाहिए क्योंकि यह गारंटी देता है कि इसके मूल्य जारी हैं।

दूसरी ओर, इस क्वेरी:

SELECT * 
FROM (
     SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn 
     FROM master 
     ) q 
WHERE rn BETWEEN 80 AND 100 

एक व्युत्पन्न की मेज के साथ बेहतर है, एक अस्थायी तालिका का उपयोग कर master से सभी मूल्यों को लाते समय की आवश्यकता होगी, जबकि इस समाधान केवल का उपयोग कर पहली 100 रिकॉर्ड को स्कैन करेगा क्योंकि सूचकांक id पर।

+0

व्युत्पन्न टेबल्स का उपयोग करने के लिए बेहतर है? सरल प्रश्नों में? –

+0

धन्यवाद Quassnoi, आपका नमूना बहुत अच्छा है। –

+0

आपने यहां 'सबसे अधिक संभवतः' क्यों उपयोग किया - "शायद दो अलग-अलग न्यूआईडी() हैं।" ? – thewpfguy

8

यह परिस्थितियों पर निर्भर करता है।

व्युत्पन्न तालिकाओं के लाभ:

  1. एक व्युत्पन्न मेज पर एक बड़ा, क्वेरी का हिस्सा है, और शेष क्वेरी के संदर्भ में अनुकूलित किया जाएगा। यह एक लाभ हो सकता है, यदि क्वेरी अनुकूलन प्रदर्शन में मदद करता है (यह आमतौर पर कुछ अपवादों के साथ करता है)। उदाहरण: यदि आप एक अस्थायी तालिका को पॉप्युलेट करते हैं, तो परिणाम को दूसरी क्वेरी में उपभोग करें, आप प्रभावी रूप से डेटाबेस इंजन को एक निष्पादन विधि में डाल रहे हैं (पूरी क्वेरी में पहली क्वेरी चलाएं, संपूर्ण परिणाम सहेजें, दूसरी क्वेरी चलाएं) जहां व्युत्पन्न तालिका के साथ ऑप्टिमाइज़र एक तेज निष्पादन विधि या पथ तक पहुंचने में सक्षम हो सकता है।

  2. क्वेरी व्युत्पन्न योजना के संदर्भ में एक व्युत्पन्न तालिका केवल "मौजूद" है - यह पूरी तरह से एक तार्किक निर्माण है। वास्तव में कोई टेबल नहीं है।

अस्थायी तालिकाओं

  1. तालिका "मौजूद है" के लाभ - जो है, यह एक तालिका के रूप में कम से कम स्मृति में materialized है, जो परिणाम सेट होता है और पुन: उपयोग किया जा सकता है।

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

0

बड़ा अंतर यह है कि आप अस्थायी तालिका पर प्राथमिक कुंजी सहित बाधा डाल सकते हैं। बड़े के लिए (मेरा मतलब लाखों रिकॉर्ड हैं) कभी-कभी आप अस्थायी के साथ बेहतर प्रदर्शन प्राप्त कर सकते हैं। मेरे पास मुख्य प्रश्न है जिसमें 5 जोड़ों की आवश्यकता है (प्रत्येक जुड़ने समान होता है)। प्रदर्शन 2 जोड़ों के साथ ठीक था और फिर तीसरे प्रदर्शन पर खराब हो गया और क्वेरी योजना पागल हो गई। संकेतों के साथ भी मैं क्वेरी प्लान को सही नहीं कर सका। व्युत्पन्न तालिकाओं और अभी भी एक ही प्रदर्शन के मुद्दों के रूप में जुड़ने के पुनर्गठन की कोशिश की। अस्थायी तालिकाओं के साथ प्राथमिक कुंजी बना सकते हैं (तब जब मैं पीके पर पहली तरह से पॉप्युलेट करता हूं)। जब एसक्यूएल 5 टेबल में शामिल हो सकता है और पीके प्रदर्शन का उपयोग मिनटों से सेकंड तक चला जाता है। मेरी इच्छा है कि एसक्यूएल व्युत्पन्न तालिकाओं और सीटीई पर बाधाओं का समर्थन करेगा (भले ही केवल एक पीके)।

4

मैं यहां एक उपेक्षा जोड़ना चाहता हूं क्योंकि यह मुझे स्वीकार किए गए उत्तर के विपरीत सलाह देने के लिए प्रेरित करता है। मैं स्वीकार किए गए उत्तर में प्रस्तुत सोच से सहमत हूं लेकिन यह ज्यादातर सैद्धांतिक है। मेरे अनुभव ने मुझे व्युत्पन्न तालिकाओं, सामान्य तालिका अभिव्यक्तियों और तालिका मूल्य कार्यों पर अस्थायी तालिकाओं की अनुशंसा करने का नेतृत्व किया है। जब तक हमने बड़े परिणाम सेट और/या अधिक जटिल प्रश्नों से निपटना शुरू नहीं किया, तब तक हमने स्वीकार किए गए उत्तर के अनुरूप विचारों के आधार पर अधिक सफलता के साथ व्युत्पन्न तालिकाओं और सामान्य तालिका अभिव्यक्तियों का उपयोग किया। फिर हमने पाया कि अनुकूलक व्युत्पन्न तालिका या सीटीई के साथ अच्छी तरह अनुकूल नहीं था।

मैंने आज एक उदाहरण देखा जो 10:15 के लिए दौड़ गया। मैंने व्युत्पन्न तालिका से परिणामों को एक अस्थायी तालिका में डाला और मुख्य क्वेरी में अस्थायी तालिका में शामिल हो गए और कुल समय 0:03 पर गिर गया। आम तौर पर जब हम एक बड़ी प्रदर्शन समस्या देखते हैं तो हम इसे इस तरह से तुरंत संबोधित कर सकते हैं। इस कारण से मैं temp टेबल की अनुशंसा करता हूं जब तक कि आपकी क्वेरी अपेक्षाकृत सरल न हो और आप निश्चित हैं कि यह बड़े डेटा सेट को संसाधित नहीं करेगा।

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