SQL सर्वर में स्थानीय और वैश्विक अस्थायी तालिकाएँ


156

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


2
इस बारे में कुछ सारांश विवरण, यहां क्लिक करें
जयेश सोरठिया

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

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

जवाबों:


114

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

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


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

बहुत स्पष्ट और संक्षिप्त जवाब। किसी को भी वैश्विक अस्थायी तालिकाओं के लिए एक अच्छा उपयोग के मामले के बारे में सोच सकते हैं? एक जो स्थानीय अस्थायी तालिकाओं के उद्देश्य के विपरीत अपने उद्देश्य को दिखाता है?
ट्रेवर

336
  • तालिका चर ( DECLARE @t TABLE) केवल उस कनेक्शन के लिए दिखाई देते हैं जो इसे बनाता है, और बैच या संग्रहीत कार्यविधि समाप्त होने पर हटा दिया जाता है।

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

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

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


55
यह भी इंगित करने के लायक है: स्थानीय अस्थायी तालिकाओं को हटा दिया जाता है जब उनके द्वारा बनाई गई गुंजाइश बंद हो जाती है। इसलिए, यदि आप एक स्पार्क के अंदर एक स्थानीय अस्थायी तालिका बनाते हैं, और फिर कोशिश करें और इसे उस स्प्रो के बाहर एक्सेस करें - यह मौजूद नहीं होगा।

विल के लिए +1। मैं एक स्थानीय अस्थायी तालिका का उपयोग एक अनुकूलक के रूप में करने की कोशिश कर रहा था और मैं एक संग्रहीत कार्यविधि का उपयोग "बनाने और आबाद करने के लिए करता हूं यदि यह मौजूद नहीं है" इनिशाइज़र। जब तक आप कहते हैं, यह तब तक काम नहीं करता है जब तक आप इसके बजाय एक वैश्विक अस्थायी तालिका का उपयोग नहीं करते हैं।
क्विलब्रेकर

9
"हटा दिया जाता है जब सभी कनेक्शन जो उन्हें संदर्भित करते हैं, वे बंद हो गए हैं" - क्या करता है "जिसने उन्हें संदर्भित किया है" बिल्कुल मतलब है? अगर एक कनेक्शन से एक StoredProc # 1 बनाता है तो ## TempTable मैं इसे दूसरे कनेक्शन से देख सकता हूं # 2 कहते हैं कि 10 मिनट बाद (यदि वह कनेक्शन # 2 टेबल निर्माण के समय सक्रिय था?) उत्तर: वैश्विक अस्थायी टेबल स्वचालित रूप से कब गिराई जाती है? सत्र जिसने तालिका समाप्त की और सभी अन्य कार्यों ने उन्हें संदर्भित करना बंद कर दिया। (विभिन्न उत्तर में इस पृष्ठ पर अधिक देखें)
tbone

मैंने बाद के तर्क द्वारा आवश्यक स्थानीय अस्थायी तालिकाओं (#t) को बनाने के लिए एक संग्रहीत प्रक्रिया का उपयोग करने की कोशिश की, हालांकि यह पता चला कि माता-पिता द्वारा संग्रहीत प्रक्रिया को उन्हें बच्चों को संग्रहीत प्रक्रिया कॉल के लिए उपलब्ध होने के लिए बनाना था। यह एक दुखद बात थी, क्योंकि हमारे पास संग्रहीत प्रक्रियाओं का एक गुच्छा है, जिन्हें तालिकाओं को उसी तरह सेट करना है और सामान्य स्पार्क्स में कॉल करना है। क्या वैश्विक टेम्प टेबल इस मामले में काम करेंगे, जहां बच्चों को कॉल करने के लिए एक भाई द्वारा बनाई गई तालिकाओं तक पहुंच होती है? हम SQL Server 2008 का उपयोग कर रहे हैं।
ब्रैंडन

1
@Brandon आप काफी सही हैं। वह कार्यशीलता गायब है। क्षणिक डेटा के उचित स्कोपिंग के लिए TSQL का समर्थन काफी स्केच है। यह ऐसा है जैसे भाषा डिजाइनर सब कुछ वैश्विक होना चाहते थे। और बंद करने के लिए लगभग कोई समर्थन नहीं है। आप एक कर्सर चर पारित कर सकते हैं। लेकिन यह कीड़े का दूसरा कारण हो सकता है क्योंकि रो-बाय-एगोनाइजिंग-रो कोई रास्ता नहीं है।
एंथनी फॉल

12

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 सर्वर कनेक्शन के लिए दिखाई देते हैं।


2
एक वैश्विक अस्थायी तालिका की आपकी परिभाषा यह है कि मैं यह कैसे व्यवहार करने की उम्मीद करूंगा (अन्य DBs से आ रहा है), लेकिन मेरा परीक्षण दिखाता है कि वास्तव में SQL सर्वर में क्या होता है: "वैश्विक अस्थायी तालिकाओं को स्वचालित रूप से हटा दिया जाता है जब सत्र जिसने तालिका बनाई थी समाप्त होता है और अन्य सभी कार्यों ने उन्हें संदर्भित करना बंद कर दिया है "
निकोले

11

ऑनलाइन पुस्तकों से उद्धरण:

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

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

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

0

स्थानीय अस्थायी तालिकाएँ : यदि आप स्थानीय अस्थायी तालिकाएँ बनाते हैं और फिर दूसरा कनेक्शन खोलते हैं और क्वेरी का प्रयास करते हैं, तो आपको निम्न त्रुटि मिलेगी।

अस्थायी टेबल केवल सत्र के भीतर ही पहुंच योग्य हैं, जिन्होंने उन्हें बनाया है।

वैश्विक अस्थायी तालिकाएँ : कभी-कभी, आप एक अस्थायी तालिका बनाना चाहते हैं जो अन्य कनेक्शनों तक पहुँच योग्य हो। इस मामले में, आप वैश्विक अस्थायी तालिकाओं का उपयोग कर सकते हैं।

वैश्विक अस्थायी तालिकाओं को केवल तब ही नष्ट कर दिया जाता है, जब इसका उल्लेख करने वाले सभी सत्र बंद हो जाते हैं।


0

यह ध्यान देने योग्य है कि यह भी है: डेटाबेस ने वैश्विक अस्थायी तालिकाओं को बंद कर दिया (वर्तमान में केवल एज़्योर 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 में सेट किया गया है और व्यक्तिगत उपयोगकर्ता डेटाबेस की सेटिंग का कोई प्रभाव नहीं है।


0

मुझे कोई जवाब नहीं दिखा कि उपयोगकर्ताओं को हम ग्लोबल टेंप-टेबल कहां मिल सकते हैं। SSMS के भीतर नेविगेट करते समय आप एक ही स्थान पर स्थानीय और वैश्विक अस्थायी तालिकाओं को देख सकते हैं। नीचे दिया गया स्क्रीनशॉट इस लिंक से लिया गया है ।

डेटाबेस -> सिस्टम डेटाबेस -> अस्थायी -> अस्थायी तालिकाएँ

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.