SQL सर्वर में स्थानीय और वैश्विक अस्थायी तालिकाओं के बीच अंतर क्या है?
SQL सर्वर में स्थानीय और वैश्विक अस्थायी तालिकाओं के बीच अंतर क्या है?
जवाबों:
मुझे यह स्पष्टीकरण काफी स्पष्ट लगता है (यह टेक्नेट से शुद्ध प्रति है ):
दो प्रकार की अस्थायी टेबल हैं: स्थानीय और वैश्विक। स्थानीय अस्थायी तालिकाएँ केवल उनके रचनाकारों को SQL सर्वर के उदाहरण के लिए उसी कनेक्शन के दौरान दिखाई देती हैं जब तालिकाएँ पहली बार बनाई गई थीं या संदर्भित थीं। SQL सर्वर के उदाहरण से उपयोगकर्ता के डिस्कनेक्ट होने के बाद स्थानीय अस्थायी तालिकाओं को हटा दिया जाता है। वैश्विक अस्थायी तालिकाएं किसी भी उपयोगकर्ता और उनके द्वारा बनाए जाने के बाद किसी भी कनेक्शन के लिए दिखाई देती हैं, और तब हटा दी जाती हैं जब सभी उपयोगकर्ता जो SQL सर्वर के उदाहरण से तालिका डिस्कनेक्ट कर रहे हैं।
तालिका चर ( DECLARE @t TABLE
) केवल उस कनेक्शन के लिए दिखाई देते हैं जो इसे बनाता है, और बैच या संग्रहीत कार्यविधि समाप्त होने पर हटा दिया जाता है।
स्थानीय अस्थायी टेबल ( CREATE TABLE #t
) केवल उस कनेक्शन के लिए दिखाई देते हैं जो इसे बनाता है, और कनेक्शन बंद होने पर हटा दिया जाता है।
वैश्विक अस्थायी तालिकाएं ( CREATE TABLE ##t
) सभी के लिए दिखाई देती हैं, और हटा दी जाती हैं जब सभी संदर्भों ने उन्हें बंद कर दिया है।
Tempdb स्थायी तालिका ( USE tempdb CREATE TABLE t
) सभी के लिए दिखाई देती हैं, और सर्वर के पुनरारंभ होने पर हटा दी जाती हैं।
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 सर्वर कनेक्शन उपयोगकर्ता द्वारा बनाए जा सकते हैं और ये सभी SQL सर्वर कनेक्शन बंद होने पर स्वचालित रूप से हटा दिए जाते हैं। वैश्विक अस्थायी तालिका नाम को डबल हैश ("##") चिह्न के साथ देखा जाता है।
CREATE TABLE ##GlobalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp
वैश्विक अस्थायी टेबल सभी SQL सर्वर कनेक्शन के लिए दिखाई देते हैं, जबकि स्थानीय अस्थायी टेबल केवल वर्तमान SQL सर्वर कनेक्शन के लिए दिखाई देते हैं।
ऑनलाइन पुस्तकों से उद्धरण:
स्थानीय अस्थायी टेबल केवल वर्तमान सत्र में दिखाई देते हैं; सभी सत्रों में वैश्विक अस्थायी तालिकाएँ दिखाई देती हैं।
जब तक कि स्पष्ट रूप से DROP टेबल का उपयोग करके गिरा नहीं दिया जाता है, तब तक अस्थायी तालिकाओं को स्वचालित रूप से छोड़ दिया जाता है:
स्थानीय अस्थायी तालिकाएँ : यदि आप स्थानीय अस्थायी तालिकाएँ बनाते हैं और फिर दूसरा कनेक्शन खोलते हैं और क्वेरी का प्रयास करते हैं, तो आपको निम्न त्रुटि मिलेगी।
अस्थायी टेबल केवल सत्र के भीतर ही पहुंच योग्य हैं, जिन्होंने उन्हें बनाया है।
वैश्विक अस्थायी तालिकाएँ : कभी-कभी, आप एक अस्थायी तालिका बनाना चाहते हैं जो अन्य कनेक्शनों तक पहुँच योग्य हो। इस मामले में, आप वैश्विक अस्थायी तालिकाओं का उपयोग कर सकते हैं।
वैश्विक अस्थायी तालिकाओं को केवल तब ही नष्ट कर दिया जाता है, जब इसका उल्लेख करने वाले सभी सत्र बंद हो जाते हैं।
यह ध्यान देने योग्य है कि यह भी है: डेटाबेस ने वैश्विक अस्थायी तालिकाओं को बंद कर दिया (वर्तमान में केवल एज़्योर SQL डेटाबेस द्वारा समर्थित है)।
SQL सर्वर के लिए वैश्विक अस्थायी तालिकाओं (## तालिका नाम के साथ आरंभ) को tempdb में संग्रहीत किया जाता है और पूरे SQL सर्वर उदाहरण में सभी उपयोगकर्ताओं के सत्रों के बीच साझा किया जाता है ।
Azure SQL डेटाबेस वैश्विक अस्थायी तालिकाओं का समर्थन करता है, जिन्हें tempdb में संग्रहीत किया जाता है और डेटाबेस स्तर पर स्कूप किया जाता है। इसका मतलब यह है कि एक ही एज़्योर SQL डेटाबेस के भीतर सभी उपयोगकर्ताओं के सत्रों के लिए वैश्विक अस्थायी तालिकाओं को साझा किया जाता है। अन्य डेटाबेस से उपयोगकर्ता सत्र वैश्विक अस्थायी तालिकाओं तक नहीं पहुंच सकते हैं।
-- Session A creates a global temp table ##test in Azure SQL Database testdb1 -- and adds 1 row CREATE TABLE ##test ( a int, b int); INSERT INTO ##test values (1,1); -- Session B connects to Azure SQL Database testdb1 -- and can access table ##test created by session A SELECT * FROM ##test ---Results 1,1 -- Session C connects to another database in Azure SQL Database testdb2 -- and wants to access ##test created in testdb1. -- This select fails due to the database scope for the global temp tables SELECT * FROM ##test ---Results Msg 208, Level 16, State 0, Line 1 Invalid object name '##test'
GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }
आवेदन करने के लिए: Azure SQL डेटाबेस (सुविधा सार्वजनिक पूर्वावलोकन में है)
वैश्विक अस्थायी तालिकाओं के लिए ऑटो-ड्रॉप कार्यक्षमता सेट करने की अनुमति देता है। डिफ़ॉल्ट ऑन है, जिसका अर्थ है कि किसी भी सत्र द्वारा उपयोग नहीं किए जाने पर वैश्विक अस्थायी तालिकाओं को स्वचालित रूप से हटा दिया जाता है। जब ऑफ पर सेट किया जाता है, तो वैश्विक अस्थायी तालिकाओं को स्पष्ट रूप से DROP टेबल स्टेटमेंट का उपयोग करके गिरा दिया जाना चाहिए या सर्वर पुनरारंभ पर स्वचालित रूप से हटा दिया जाएगा।
Azure SQL डेटाबेस एकल डेटाबेस और लोचदार पूल के साथ, यह विकल्प SQL डेटाबेस सर्वर के व्यक्तिगत उपयोगकर्ता डेटाबेस में सेट किया जा सकता है। SQL सर्वर और Azure SQL डेटाबेस प्रबंधित उदाहरण में, यह विकल्प TempDB में सेट किया गया है और व्यक्तिगत उपयोगकर्ता डेटाबेस की सेटिंग का कोई प्रभाव नहीं है।
मुझे कोई जवाब नहीं दिखा कि उपयोगकर्ताओं को हम ग्लोबल टेंप-टेबल कहां मिल सकते हैं। SSMS के भीतर नेविगेट करते समय आप एक ही स्थान पर स्थानीय और वैश्विक अस्थायी तालिकाओं को देख सकते हैं। नीचे दिया गया स्क्रीनशॉट इस लिंक से लिया गया है ।
डेटाबेस -> सिस्टम डेटाबेस -> अस्थायी -> अस्थायी तालिकाएँ