14

क्या temp तालिकाओं का उपयोग करने के बजाय सीटीई (सामान्य तालिका अभिव्यक्तियों) का उपयोग करने का कोई लाभ है।सीटीई और टीईएमपी टेबल के बीच मुख्य अंतर क्या हैं?

मैं दोनों के बीच प्रदर्शन परीक्षण के माध्यम से चला गया लेकिन मुझे उनके बीच बहुत अंतर नहीं मिला। सीटीई का उपयोग करने के कुछ पेशेवर और विपक्ष क्या हैं?

+9

[क्या एक CTE और एक अस्थायी तालिका के बीच का अंतर है?] (http://dba.stackexchange.com/q/13112/ देखें 36 9 0) –

+0

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

+1

वे अलग-अलग चीजें हैं, और वास्तव में यह पाठ्यक्रमों के लिए घोड़े हैं। कौन सा सबसे अच्छा होगा आपके सटीक परिदृश्य पर निर्भर करेगा। आपका प्रश्न 'टेबल के बजाय दृश्यों का उपयोग करने के क्या फायदे हैं' से कम अस्पष्ट नहीं है? – GarethD

उत्तर

12

शायद सीटीई और एक अस्थायी तालिका के बीच सबसे बड़ा अंतर यह है कि सीटीई के पास एकल का निष्पादन दायरा है, चयन करें, अद्यतन करें, अद्यतन करें, हटाएं या दृश्य कथन बनाएं।

अनिवार्य रूप से आप सीटीई का पुन: उपयोग नहीं कर सकते, जैसे आप temp तालिकाओं के साथ कर सकते हैं।

documentation

एक आम तालिका अभिव्यक्ति (CTE) एक अस्थायी परिणाम सेट है कि एक ही का चयन करें, सम्मिलित करें, अद्यतन, हटाने या के निष्पादन के दायरे के भीतर परिभाषित किया गया है के बारे में सोचा जा सकता है से

दृश्य कथन बनाएं। एक सीटीई व्युत्पन्न तालिका के समान है जिसमें यह किसी ऑब्जेक्ट के रूप में संग्रहीत नहीं है और केवल क्वेरी की अवधि के लिए रहता है। व्युत्पन्न तालिका के विपरीत, सीटीई आत्म-संदर्भित हो सकता है और में एक ही क्वेरी में कई बार संदर्भित किया जा सकता है।

एक CTE इस्तेमाल किया जा सकता करने के लिए:

  1. एक पुनरावर्ती पूछताछ बनाएँ। अधिक जानकारी के लिए, सामान्य तालिका अभिव्यक्तियों का उपयोग करके रिकर्सिव क्वेरीज़ देखें।

  2. एक दृश्य के सामान्य उपयोग जब दृश्य के सामान्य उपयोग की आवश्यकता नहीं है; यानी, आपको मेटाडेटा में परिभाषा को स्टोर करने की आवश्यकता नहीं है।

  3. स्केलर उप-चयन से प्राप्त कॉलम द्वारा समूहबद्ध करना सक्षम करें, या एक फ़ंक्शन जो या तो निर्धारिती नहीं है या बाहरी पहुंच है।

  4. उसी कथन में परिणामी तालिका को कई बार संदर्भित करें।

+17

को फिर से चलाता है मेरे लिए सबसे बड़ा अंतर यह है कि एक वास्तविक तालिका है और दूसरा नहीं है। 'सीटीई एएस के साथ (चयन करें * मिलियन रोटेबल से चुनें) सीटीई से शीर्ष 1 * चुनें और #T चयन में * INRERT * मिलियन ROWTable से; शीर्ष 1 * से चुनें # टी' –

+2

@ मार्टिनस्मिथ आपकी टिप्पणी के उत्तर से अधिक वोट हैं !! –

+0

यह दूसरी तरफ भी जा सकता है: 'तालिका में डालें' के बाद 'चयन करें .. जहां # टेबल' में xyz नहीं है, लेकिन सीटीई के रूप में पुनः लिखना इसे धीमा कर देता है। –

3

CTE: CTE आम टेबल भाव के लिए खड़ा है। इसे SQL सर्वर 2005 के साथ पेश किया गया था। इसका उपयोग अस्थायी अड्डों पर जटिल उप-क्वेरी के परिणाम को संग्रहीत करने के लिए किया जाता है। इसका जीवन वर्तमान क्वेरी तक ही सीमित है। यह कथन के साथ प्रयोग करके परिभाषित किया गया है। यह मुख्य रूप से रिकर्सिव कॉल के लिए उपयोग किया जाता है।

उदाहरण

;with myCTE as 
(
    select ParentLevel, ParentID, ChildID 
    from MHA 
    where ChildID = 1 
    UNION ALL 
    select MHA.ParentLevel, MHA.ParentID, MHA.ChildID 
    from MHA 
    inner join myCTE on MHA.ParentID = myCTE.ChildID 
    where MHA.ParentID <> 0 
) 

(त्रुटि)

select top (5) * from myCTE 

तो ऊपर के उदाहरण में, मैं myCTE रूप CTE नाम बनाने के लिए है, यह है कि केवल ऊपर क्वेरी में उपयोग किया जा सकता है (मैं यह कर सकते हैं उपर्युक्त क्वेरी के बाहर myCTE का उपयोग न करें)

टेम्प: इसका उपयोग अस्थायी अड्डों पर क्वेरी के परिणाम को संग्रहीत करने के लिए भी किया जाता है। लेकिन इसका जीवन वर्तमान सत्र तक ही सीमित है। इसे # का उपयोग करके परिभाषित किया गया है। यह रिकर्सिव का समर्थन नहीं करता है।

उदाहरण:

select * into #tempTable from MHA 

ऊपर क्वेरी में मैं अस्थायी टेबल बनाया है, अब मैं इसे अस्थायी तालिका बाहर इस क्वेरी के पक्ष लेकिन साथ सत्र में उपयोग कर सकते हैं। नीचे

(कोई त्रुटि)

select top (5) * from #tempTable 
डीबीए साइट से
संबंधित मुद्दे