2009-08-19 8 views
24

तो, हाल ही में एक डीबीए हमें बताने के लिए है कि हमएसक्यूएल सर्वर का चयन में और अस्थायी टेबल्स के साथ ब्लॉक कर रहा है

SELECT X, Y, Z 
INTO #MyTable 
FROM YourTable 

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

हम सबूत ढूंढने की कोशिश कर रहे हैं कि हमें अपने सभी अस्थायी तालिकाओं के लिए टेबल # MyTable ... बनाना नहीं है, लेकिन न तो पक्ष सबूत पा सकता है। मैं किसी भी अंतर्दृष्टि की तलाश में हूं SO लोगों के पास है।

अतिरिक्त सूचना

वर्तमान में SQL सर्वर 2005 के साथ काम करने, और जल्द ही एसक्यूएल सर्वर 2008 (उद्यम संस्करण) होने के लिए

+0

आप इसे क्यों परीक्षण नहीं करते हैं? – automatic

+0

हम गए हैं, और मुझे कोई अवरोध नहीं दिख रहा है ..... हम कुछ प्रकार के सबूत खोजने की कोशिश कर रहे हैं, या बेहतर अभी तक प्रलेखन –

उत्तर

34

कि सलाह के आसपास for a long time चल कर दिया गया है

एसक्यूएल सर्वर में आ रही बाधाओं 6.5

बहुत से लोग एक अस्थायी तालिका, कुछ इस तरह बनाने के लिए एक चयन का उपयोग करें ... क्वेरी जांच:

चुनें * जांच #TempTable से SourceTable

हालांकि यह w orks, यह SELECT कथन की अवधि के लिए tempdb डेटाबेस के खिलाफ ताले (काफी देर आप स्रोत तालिका में डेटा का एक बहुत माध्यम से trawling अगर कर रहे हैं, और लंबे समय तक अभी भी का चयन करते हैं ... जांच बनाता है की लंबी शुरुआत में स्पष्ट लेनदेन की शुरुआत में है) लॉक होने पर, कोई अन्य उपयोगकर्ता अस्थायी तालिकाओं को बना सकता है। बाधा के वास्तविक स्थान tempdb सिस्टम टेबल पर लॉक है। बाद में SQL सर्वर के संस्करणों में, लॉकिंग मॉडल बदल गया है और समस्या से बचा है।

सौभाग्य से, यह केवल SQL 6.5 के लिए एक समस्या थी। यह 7.0 और बाद में तय किया गया था।

+3

+1 मुझे लगता है कि डीबीए की सलाह तब एक पौराणिक कार्यवाही के लिंक के लिए पौराणिक कथाओं –

+0

+1 की श्रेणी के अंतर्गत आती है - WHERE 1 = 0 – SqlRyan

+0

क्या आप अपने उत्तर को SQL की नई कार्यक्षमता के साथ अपडेट कर सकते हैं क्योंकि आपका उत्तर पहले चालू हो गया है Google खोज और यह नवीनतम संस्करण के लिए मान्य होना चाहिए। टीआईए :) –

0

मैं कहूंगा कि सबूत ताला लगा की कमी नहीं लॉकिंग, जो आपके सबूत है का मतलब है। TempDB को लॉक करने में कोई फर्क क्यों पड़ता है (CREATE या SELECT ... INTO) में अस्थायी तालिका बनाई गई विधि क्यों होगी?

+0

यह हमारे विचार और तर्क भी है .... लेकिन वे हैं जोर देकर कहा कि संग्रहित प्रक्रिया का उपयोग संग्रहीत प्रक्रिया की अवधि के लिए अवरुद्ध करने का कारण बनता है। –

+0

मुझे आश्चर्य है कि अस्थायी तालिका को लॉक क्यों किया जा रहा है एक चिंता भी है। यदि यह एक वैश्विक अस्थायी तालिका थी, तो यह एक अलग कहानी है। –

+0

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

0

ठीक है अगर यह सच था तो mssql में समस्याएं होंगी, क्योंकि कोई भी बड़ी क्वेरी पंक्तियों की प्रतिलिपि रखने के लिए tempdb का उपयोग कर सकती है। इसे अक्सर तालिका योजना के रूप में क्वेरी योजनाओं में देखा जा सकता है या हैश जॉइन ऑपरेटर द्वारा इसका उपयोग किया जा सकता है यदि यह अपनी बाल्टी के लिए स्मृति से बाहर हो जाता है।

आप तालिका चर का उपयोग कर देख सकते हैं, जो mssql स्मृति में स्टोर करने का प्रयास करेगा और बड़े होने पर tempdb पर ले जाएगा।

DECLARE @foo TABLE (x int, y int, z int) 
INSERT INTO @foo(x, y, z) SELECT x, y, z FROM YourTable 

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

16

यह संभवतः लंबे समय तक तैर जाएगा, विभिन्न 'सलाहकारों' के जेब खिला रहा है। सभी मिथकों की तरह, इसमें सच्चाई का कर्नेल है और बहुत सारे बीएस हैं।

सत्य: एसक्यूएल 2000 और पिछले संस्करणों में tempdb में विस्तार के आवंटन के आसपास विवाद समस्याएं थीं। वास्तव में सभी डेटाबेस में विवाद सत्य था, लेकिन कुछ भारी tempdb उपयोग के कारण tempdb में अधिक दिखाई देता है। यह KB328551 में दर्ज है:

जब tempdb डेटाबेस भारी इस्तेमाल किया, एसक्यूएल सर्वर विवाद का अनुभव हो सकता है जब यह पृष्ठों का आवंटन करने की कोशिश करता है। ": 1: 1 2" (PFS पृष्ठ) या "2: 1: 3" (SGAM पृष्ठ)

sysprocesses सिस्टम टेबल उत्पादन से, waitresource रूप नज़र आ सकते हैं। विवाद की डिग्री के आधार पर, यह छोटी अवधि के लिए अनुत्तरदायी दिखाई देने वाला SQL सर्वर भी हो सकता है।

ये ऑपरेशन भारी उपयोग tempdb:
अस्थायी तालिकाओं (स्थानीय या वैश्विक) के दोहराए गए और ड्रॉप को दोहराया गया।
तालिका चर जो भंडारण उद्देश्यों के लिए tempdb का उपयोग करते हैं।
कर्सर से जुड़े कार्य तालिकाएं।
से संबंधित कार्य तालिका खंड द्वारा ऑर्डर करें।
ग्रुप बाय क्लॉज से जुड़े वर्क टेबल।
हैश योजनाओं से जुड़े कार्य फ़ाइलें।

इन गतिविधियों के भारी और महत्वपूर्ण उपयोग से समस्याएं हो सकती हैं।

एक ट्रेस ध्वज -T1118 एसक्यूएल सर्वर 2000 SP3 कि मिश्रित पृष्ठों आवंटन के लिए एक राउंड-रोबिन एल्गोरिथ्म का उपयोग करने के लिए मजबूर कर रहा एसक्यूएल गया था में जोड़ा गया है। यह नया एल्गोरिदम, जब बराबर आकार फ़ाइलों के सेट के शीर्ष पर tempdb को तैनात करने के अभ्यास से संबंधित है, प्रत्येक सीपीयू के लिए एक, विवाद को कम करेगा। ट्रेस ध्वज अभी भी एसक्यूएल 2005/2008 में मौजूद है, हालांकि इसकी आवश्यकता होने की बहुत कम संभावना है।

इस मिथक के बारे में बाकी सब कुछ काफी बीएस है।

  • #temp टेबल का उपयोग अवरुद्ध करने के कारण करता है? नहीं। सबसे खराब यह SQL 2000 और इससे पहले लोड के तहत विवाद बढ़ाता है, लेकिन यह कहने से बहुत रोना है कि यह कुछ भी अवरुद्ध करता है। आपको पहले मापना होगा और देखें कि यह मामला है, और अगर उपचार उपायों को तैनात करें (प्रति सीपीयू एक tempdb फ़ाइल आवंटित करें, उन्हें बराबर आकार दें, -111118 चालू करें) ..
  • चुनता है ... में #temp चयन की अवधि के लिए कुछ ब्लॉक? ज़रुरी नहीं।
  • चुनिंदा प्रक्रिया की अवधि के लिए #temp ब्लॉक में कुछ चुनता है? बिलकुल नहीं। बस उस दावे को पढ़ना और मैं हंसी में फट गया।

अधिक जानकारी के लिए, यह आलेख है: Misconceptions around TF1118

+0

इस जानकारी के लिए धन्यवाद! –

+1

यदि [चुनिंदा ... #temp में] लेनदेन में है, लेनदेन प्रतिबद्ध करने से पहले, [sysobjects से चयन करें] किसी अन्य सत्र में अवरुद्ध कर दिया जाएगा। सिस्टम में कमियों का शोषण करने वाले हैक्स के लिए –

0

SELECT INTO #temp_table कथन की अवधि के लिए tempdb में एक शेमा लॉक रखता है क्योंकि यह पूरा करने वाला काम तालिका का निर्माण कर रहा है। यह CREATE TABLE #.... का उपयोग कर तालिका बनाने से पहले मूल रूप से अलग है और उसके बाद एक सेट आधारित INSERT चला रहा है। SELECT INTO के पास INSERT से अधिक फायदे हैं, विशेष रूप से ऑपरेशन को न्यूनतम रूप से लॉग किया गया है यदि डेटाबेस का पुनर्प्राप्ति मॉडल सरल या थोक लॉग है।

10

निम्नलिखित क्यों नहीं करते?

SELECT X, Y, Z 
INTO #MyTable 
FROM YourTable 
WHERE 1 = 2 

कथन तुरंत चल जाएगा - अपनी अस्थायी तालिका बनाना और किसी भी संभावित लॉकिंग से परहेज करना। फिर आप इसे सामान्य रूप से सम्मिलित कर सकते हैं:

INSERT #MyTable 
SELECT X, Y, Z 
FROM YourTable 
+1

+1। – jp2code

1

यदि आप किसी लेनदेन के अंदर # टेम्पलेट टेबल बनाते हैं तो आप अवरुद्ध कर सकते हैं। हालांकि आम तौर पर इसकी अनुशंसा नहीं की जाती है, मैंने देखा है कि यह बहुत कुछ किया है।

हालांकि इस कारण को अवरुद्ध करना tempdb में कुछ सिस्टम टेबल पर है जो temp टेबल बनाने से अन्य कनेक्शन को प्रभावित नहीं करता है (शायद 2000 से पहले SQL संस्करणों को छोड़कर?)। इसका मतलब यह है कि tempdb पर sp_spacesused चलाना तब तक अवरुद्ध होगा जब तक कि आप असामान्य पढ़ने के लिए लेनदेन अलगाव स्तर सेट न करें। एसएसएमएस से tempdb पर गुणों को देखने में भी असफल रहेगा और टाइमआउट में कोई संदेह नहीं होगा क्योंकि यह पढ़ा गया लेनदेन अलगाव स्तर का उपयोग कर रहा है।

0

जबकि चयन INTO को tempdb को अवरुद्ध करने से ठीक किया गया है, लेकिन कुछ सिस्टम तालिकाओं के परीक्षण के तहत इस तरह के कोड लिखते समय सावधानी बरतनी होगी।

संदर्भ: http://www.sqlservercentral.com/Forums/Topic1642797-2799-1.aspx

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