2009-11-09 53 views
110

एसक्यूएल सर्वर 2008 में एक तालिका (कॉलम को हटाने) को बदलने के दौरान, मैंने जनरेट चेंज स्क्रिप्ट बटन पर क्लिक किया और मैंने देखा कि उत्पन्न स्क्रिप्ट स्क्रिप्ट कॉलम को छोड़ देती है, "जाओ" कहती है और फिर दिखाई देने वाला एक अतिरिक्त वैकल्पिक तालिका कथन चलाती है तालिका के लिए लॉक एस्केलेशन को "टेबल" पर सेट करने के लिए। उदाहरण:लॉक एस्केलेशन - यहां क्या हो रहा है?

ALTER TABLE dbo.Contract SET (LOCK_ESCALATION = TABLE) 

मुझे यह भी ध्यान रखना चाहिए कि यह आखिरी बात है कि परिवर्तन स्क्रिप्ट कर रही है। यह यहाँ क्या कर रहा है और यह LOCK_ESCALATION को तालिका में क्यों सेट कर रहा है?

उत्तर

141

"Lock Escalation" एसक्यूएल बड़े अपडेट के लिए लॉकिंग कैसे संभालता है। जब एसक्यूएल बहुत सारी पंक्तियों को बदलने जा रहा है, तो डेटाबेस इंजन के लिए यह बहुत ही कुशल है कि कई छोटी चीजें (जैसे पंक्ति ताले) को लॉक करने के बजाय कम, बड़े ताले (उदा। पूरी तालिका) ले जाएं।

लेकिन जब आपके पास एक बड़ी मेज है, तो यह समस्याग्रस्त हो सकता है, क्योंकि पूरे टेबल पर लॉक लेना लंबे समय तक अन्य प्रश्नों को लॉक कर सकता है। यह ट्रेडऑफ है: कई छोटे-ग्रैन्युलरिटी लॉक कम (या एक) मोटे अनाज वाले ताले से धीमे होते हैं, और एक टेबल के विभिन्न हिस्सों को लॉक करने के कई प्रश्न होने पर एक प्रक्रिया किसी अन्य पर इंतजार कर रही है, तो डेडलॉक की संभावना पैदा होती है।

एक टेबल-स्तरीय विकल्प है, LOCK_ESCALATION, एसक्यूएल 2008 में नया, जो लॉक एस्केलेशन के नियंत्रण की अनुमति देता है। डिफ़ॉल्ट, "टेबल" ताले टेबल स्तर पर सभी तरह से बढ़ने की अनुमति देता है। अक्षम अधिकांश मामलों में पूरी तालिका में लॉक वृद्धि को रोकता है। ऑटो तालिका तालिका को अनुमति देता है सिवाय इसके कि तालिका को विभाजित किया गया है, इस स्थिति में ताले केवल विभाजन स्तर तक ही बने होते हैं। अधिक जानकारी के लिए this blog post देखें।

मुझे संदेह है कि आईडीई इस तालिका को फिर से बनाते समय इस सेटिंग को जोड़ता है क्योंकि तालिका SQL 2008 में डिफ़ॉल्ट है। ध्यान दें कि LOCK_ESCALATION SQL 2005 में समर्थित नहीं है, इसलिए इसे चलाने का प्रयास करते समय आपको इसे पट्टी करने की आवश्यकता होगी 2005 के उदाहरण पर लिपि। साथ ही, चूंकि तालिका डिफ़ॉल्ट है, इसलिए आप अपनी स्क्रिप्ट को फिर से चलाने पर सुरक्षित रूप से उस पंक्ति को हटा सकते हैं।

भी ध्यान रखें कि, एसक्यूएल 2005 में से पहले इस सेटिंग मौजूद था, सभी ताले दूसरे शब्दों में तालिका level-- को बढ़ा सकता है, "टेबल" एसक्यूएल पर केवल सेटिंग था 2005

+1

एमएसडीएन मंचों पर भी डुप्लिकेट पोस्ट: http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/e96aa19e-d72c-46af-b2e8-4bf54de09440 –

+0

@ जस्टिनग्रेंट: क्या यह अभिव्यक्ति हो सकती है 'तालिका बनाएं' कथन के साथ संयुक्त हो जाएं? –

+6

@dma_k - यह विकल्प 'CREATE तालिका 'के लिए प्रासंगिक नहीं है क्योंकि तालिका अभी तक मौजूद नहीं है इसलिए लॉक करने के लिए कुछ भी नहीं है। –

6

आप देख सकते हैं आप पहले इस मूल्य की तुलना करके और अपनी स्क्रिप्ट का मुख्य हिस्सा चलाने के बाद अपनी स्क्रिप्ट में LOCK_ESCALATION बयान शामिल करने की जरूरत:

SELECT lock_escalation_desc FROM sys.tables WHERE name='yourtablename' 

मेरे मामले में, ड्रॉप या एक बाधा जोड़ने के लिए तालिका में फेरबदल इस संशोधित करने के लिए प्रतीत नहीं होता मूल्य।

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