2010-05-27 17 views
106

में स्थानीय और वैश्विक अस्थायी तालिका SQL सर्वर में स्थानीय और वैश्विक अस्थायी तालिकाओं के बीच क्या अंतर है?SQL सर्वर

+1

यहाँ कुछ सारांश इस बारे में जानकारी दी जा रही, [यहाँ क्लिक करें] (http://jayeshsorathia.blogspot.com/2012/03/beginning-sql-difference-between-local.html) जब तालिका का उपयोग कर सावधान रहें –

+4

चर। यदि आप उन्हें किसी क्वेरी में उपयोग करते हैं, तो वे आपकी क्वेरी प्लान के साथ गंभीर प्रदर्शन समस्याओं का कारण बन सकते हैं क्योंकि उन्हें अनुक्रमित नहीं किया गया है। –

+0

असल में, यदि आवश्यक हो, तो temp तालिकाओं को अनुक्रमित किया जा सकता है, लेकिन इसमें समय और संसाधन भी लगते हैं, इसलिए यह अभी भी प्रदर्शन या संसाधन के मुद्दों का कारण बन सकता है। –

उत्तर

80

मैं इस स्पष्टीकरण काफी स्पष्ट है (यह Technet से शुद्ध प्रति है) लगता है: स्थानीय और वैश्विक:

अस्थायी तालिकाओं के दो प्रकार के होते हैं। स्थानीय अस्थायी सारणी केवल SQL सर्वर के उदाहरण के समान कनेक्शन के दौरान उनके रचनाकारों के लिए दृश्यमान होती हैं जब तालिकाएं पहली बार बनाई गई थीं या संदर्भित की गई थीं। SQL सर्वर के उदाहरण से उपयोगकर्ता डिस्कनेक्ट होने के बाद स्थानीय अस्थायी तालिका हटा दी जाती है। ग्लोबल अस्थायी टेबल किसी भी उपयोगकर्ता और उनके निर्माण के बाद किसी भी कनेक्शन के लिए दृश्यमान होते हैं, और हटाए जाते हैं जब तालिका का संदर्भ देने वाले सभी उपयोगकर्ता SQL सर्वर के उदाहरण से डिस्कनेक्ट होते हैं।

+0

महान, उपयोगी उत्तर! मैं विशिष्ट जानकारी की तलाश कर रहा था कि क्या वैश्विक टेम्पलेट टेबल स्वचालित रूप से SQL सर्वर द्वारा साफ़ किए गए थे। – kwill

9

पुस्तकें ऑनलाइन से हवाला देते हुए:

स्थानीय अस्थायी तालिकाओं केवल वर्तमान सत्र में दिखाई दे रहे हैं; वैश्विक अस्थायी सारणी सभी सत्रों के लिए दृश्यमान हैं।

अस्थायी तालिकाओं स्वचालित रूप से हटा दिया जाता है जब वे क्षेत्र से बाहर जाना जब तक स्पष्ट ड्रॉप तालिका का उपयोग कर गिरा दिया: जब संग्रहीत प्रक्रिया पूरी होती है

  • एक संग्रहीत प्रक्रिया में बनाए गए एक स्थानीय अस्थायी तालिका स्वचालित रूप से हटा दिया गया है। टेबल को संग्रहीत प्रक्रिया द्वारा निष्पादित किसी भी नेस्टेड संग्रहीत प्रक्रियाओं द्वारा संदर्भित किया जा सकता है। तालिका को उस प्रक्रिया द्वारा संदर्भित नहीं किया जा सकता है जिसे तालिका बनाई गई संग्रहित प्रक्रिया कहा जाता है।
  • अन्य सभी स्थानीय अस्थायी सारणी वर्तमान सत्र के अंत में स्वचालित रूप से गिरा दी जाती हैं।
  • वैश्विक अस्थायी तालिकाओं को स्वचालित रूप से तब गिरा दिया जाता है जब तालिका समाप्त होती है और अन्य सभी कार्यों ने उन्हें संदर्भित करना बंद कर दिया है। किसी कार्य और तालिका के बीच संबंध केवल एक ट्रांजैक्ट-एसक्यूएल कथन के जीवन के लिए बनाए रखा जाता है। इसका मतलब है कि आखिरी ट्रांजैक्ट-एसक्यूएल कथन पूरा होने पर एक वैश्विक अस्थायी तालिका गिरा दी गई है जो निर्माण सत्र समाप्त होने पर तालिका को सक्रिय रूप से संदर्भित कर रहा था।
247
  • तालिका चर (DECLARE @t TABLE) केवल कनेक्शन है कि यह बनाता है के लिए दिखाई दे रहे हैं, और नष्ट हो जाती हैं जब बैच या संग्रहीत प्रक्रिया समाप्त होता है।

  • स्थानीय अस्थायी तालिकाओं (CREATE TABLE #t) केवल कि यह बनाता है कनेक्शन के लिए दिखाई दे रहे हैं, और जब कनेक्शन बंद कर दिया है नष्ट हो जाती हैं।

  • वैश्विक अस्थायी तालिकाओं (CREATE TABLE ##t) सब लोग, दिखाई देती हैं और जब सभी कनेक्शनों है कि उन्हें संदर्भित किया है बंद कर दिया है नष्ट हो जाती हैं।

  • Tempdb स्थायी टेबल (USE tempdb CREATE TABLE t) सबको दिखाई देते हैं, और जब सर्वर पुनरारंभ नष्ट हो जाती हैं।

+37

यह भी ध्यान देने योग्य है: स्थानीय अस्थायी तालिकाओं को हटा दिया जाता है जब उन्हें बनाए गए दायरे को बंद कर दिया जाता है। इसलिए, यदि आप एक स्पोक के अंदर एक स्थानीय अस्थायी तालिका बनाते हैं, और फिर उस स्पोक के बाहर इसे आज़माएं और एक्सेस करें - यह अस्तित्व में नहीं होगा। Will के लिए –

+0

+1। मैं एक स्थानीय अस्थायी तालिका को एक ऑप्टिमाइज़र के रूप में उपयोग करने का प्रयास कर रहा था और मैं एक संग्रहित प्रक्रिया का उपयोग "प्रारंभ और जनसंख्या" के रूप में प्रारंभ करने के लिए कर रहा था "प्रारंभकर्ता"। जैसा कि आप कहते हैं, यह तब तक काम नहीं करता जब तक कि आप इसके बजाय वैश्विक अस्थायी तालिका का उपयोग न करें। Tempdb स्थायी तालिकाओं सहित – quillbreaker

+8

+1। – CoderDennis

9

1।)एक स्थानीय अस्थायी तालिका केवल एक कनेक्शन की अवधि के लिए मौजूद है, या यौगिक कथन की अवधि के लिए, यौगिक कथन के अंदर परिभाषित किया गया है।

स्थानीय अस्थायी सारणी केवल SQL सर्वर सत्र या कनेक्शन (एकल उपयोगकर्ता का मतलब है) के लिए उपलब्ध हैं जो टेबल बनाते हैं। ये स्वचालित रूप से हटा दिए जाते हैं जब तालिका बनाने वाले सत्र में बंद हो गया है। स्थानीय अस्थायी तालिका का नाम एकल हैश ("#") चिह्न के साथ देखा गया है।

CREATE TABLE #LocalTemp 
(
UserID int, 
Name varchar(50), 
Address varchar(150) 
) 
GO 
insert into #LocalTemp values (1, 'Name','Address'); 
GO 
Select * from #LocalTemp 

स्थानीय अस्थायी तालिका के दायरे वर्तमान उपयोगकर्ता के चालू सत्र के लिए मौजूद वर्तमान क्वेरी खिड़की का मतलब है। यदि आप वर्तमान क्वेरी विंडो बंद कर देंगे या एक नई क्वेरी विंडो खोलेंगे और से ऊपर की गई टेम्प तालिका को खोजने का प्रयास करेंगे, तो यह आपको त्रुटि देगा।


2.)एक वैश्विक अस्थायी तालिका डेटाबेस स्थायी रूप से रहता है, लेकिन पंक्तियों केवल एक दिए गए कनेक्शन के भीतर मौजूद। जब कनेक्शन बंद हो जाता है, तो वैश्विक अस्थायी तालिका में डेटा गायब हो जाता है। हालांकि, अगली बार डेटाबेस खोले जाने पर तालिका परिभाषा डेटाबेस के साथ तब भी बनी हुई है जब डेटाबेस खोला जाता है।

वैश्विक अस्थायी तालिकाओं सभी एसक्यूएल सर्वर सत्र या कनेक्शन (सभी उपयोगकर्ता का मतलब है) के लिए उपलब्ध हैं। इन्हें किसी भी SQL सर्वर कनेक्शन उपयोगकर्ता द्वारा बनाया जा सकता है और ये सभी SQL सर्वर कनेक्शन बंद होने पर स्वचालित रूप से हटा दिए जाते हैं। वैश्विक अस्थायी तालिका नाम डबल हैश ("##") चिह्न के साथ देखा गया है। जबकि स्थानीय अस्थायी तालिकाओं केवल वर्तमान एसक्यूएल सर्वर कनेक्शन के लिए दिखाई दे रहे हैं

CREATE TABLE ##GlobalTemp 
(
UserID int, 
Name varchar(50), 
Address varchar(150) 
) 
GO 
insert into ##GlobalTemp values (1, 'Name','Address'); 
GO 
Select * from ##GlobalTemp 

वैश्विक अस्थायी तालिकाओं सभी एसक्यूएल सर्वर कनेक्शन के लिए दिखाई दे रहे हैं।