SQL सर्वर 2014 CTP1 ऑनलाइन इंडेक्स संचालन और विभाजन स्विच के साथ उपयोग के लिए कम प्राथमिकता वाले लॉक प्रतीक्षा विकल्पों को प्रस्तुत करता है।
SQL सर्वर 2012 एंटरप्राइज़ संस्करण में ऑनलाइन अनुक्रमणिका प्रबंधन या अनुक्रमणिका विभाजन और विभाजन स्विच संचालन का लाभ उठाने वालों के लिए, आपको एक बिंदु पर अपने DDL संचालन को अवरुद्ध करने का अनुभव हो सकता है क्योंकि इन कार्यों में अभी भी कुछ लॉकिंग आवश्यकताएं हैं।
उदाहरण के लिए, कल्पना करें कि मैं SQL सर्वर 2014 CTP1 में निम्नलिखित एकल-विभाजन ऑनलाइन अनुक्रमणिका पुनर्निर्माण निष्पादित करता हूं:
ALTER INDEX [ClusteredIndex_on_ps_ShipDate]ON [dbo]।[FactInternetSales]REBUILD PARTITION =(37)साथ (ONLINE=ON);
और आइए विस्तारित घटनाओं और निम्नलिखित सत्र परिभाषा का उपयोग करके इस पुनर्निर्माण ऑपरेशन के दौरान प्राप्त और जारी किए गए ताले पर एक नज़र डालें (यह लक्ष्य-कम सत्र है और मैंने SQL सर्वर प्रबंधन स्टूडियो में "लाइव डेटा देखें" फलक के माध्यम से परिणाम देखे हैं):
ईवेंट सत्र बनाएं [ऑनलाइन_इंडेक्स_रीबिल्ड_लॉक_टेकन] सर्वर पर ईवेंट जोड़ें 4096 केबी, EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS, MAX_DISPATCH_LATENCY=30 SECONDS, MAX_EVENT_SIZE=0 KB, MEMORY_PARTITION_MODE=NONE, TRACK_CAUSALITY=OFF, STARTUP_STATE=OFF);मान 309576141, FactInternetSales तालिका के ऑब्जेक्ट आईडी का प्रतिनिधित्व करता है।
एक विभाजन के मेरे ऑनलाइन अनुक्रमणिका पुनर्निर्माण को पूरा होने में 56 सेकंड का समय लगा और पूरा होने के बाद, मैंने निम्नलिखित लॉक अधिग्रहण और रिलीज गतिविधि देखी:
एकल-विभाजन ऑनलाइन पुनर्निर्माण के लिए गतिविधि लॉक करेंजैसा कि आप आउटपुट से देख सकते हैं, हालांकि पुनर्निर्माण एक ऑनलाइन ऑपरेशन है, इसमें ऑपरेशन के जीवन चक्र पर विभिन्न मोड में ताले प्राप्त करना शामिल है। आदर्श रूप से लॉक की अवधि न्यूनतम होती है (उदाहरण के लिए - टाइमस्टैम्प पहले
SCH_S
के लिए समान है ताला अधिग्रहित और जारी किया गया)। लेकिन लॉकिंग की एक न्यूनतम राशि के साथ भी आप निश्चित रूप से समवर्ती मुद्दों का सामना कर सकते हैं जो इंडेक्स के पुनर्निर्माण या स्विच किए जाने के खिलाफ चल रहे लेनदेन पर निर्भर करता है।मैंने इस पोस्ट की शुरुआत में उल्लेख किया है कि Microsoft ने SQL सर्वर 2014 CTP1 में ऑनलाइन संचालन और विभाजन स्विच संचालन के लिए कम प्राथमिकता वाले लॉक प्रतीक्षा विकल्प पेश किए। विभाजन स्विच के विषय पर, कल्पना कीजिए कि मैं निम्नलिखित ऑपरेशन निष्पादित करता हूं:
वैकल्पिक तालिका [AdventureWorksDW2012]।[dbo]।[FactInternetSales] पार्टिशन 37 को [AdventureWorksDW2012] में बदलें।इस ऑपरेशन के लिए प्राप्त और जारी किए गए ताले देखने के लिए, मैंने लागू वस्तुओं (स्रोत और लक्ष्य तालिका) को शामिल करने के लिए अपने पहले परिभाषित विस्तारित ईवेंट सत्र को संशोधित किया। मैंने निम्नलिखित देखा:
पार्टीशन स्विच ऑपरेशन के लिए गतिविधि लॉक करेंएक खाली पार्टीशन में स्विच ऑपरेशन एक सेकंड से भी कम समय में हुआ, लेकिन हम अभी भी देखते हैं कि
SCH_S
औरSCH_M
स्रोत और गंतव्य दोनों पर संचालन जीवनचक्र के दौरान ताले की आवश्यकता थी (309576141 FactInternetSales और 398624463 स्टेजिंग_FactInternetSales)।तो फिर, जबकि लॉकिंग की अवधि बेहद संक्षिप्त हो सकती है, जब कोई समवर्ती लेनदेन नहीं होते हैं, तो हम जानते हैं कि यह हमेशा संभव नहीं होता है और इसलिए हमारे ऑनलाइन इंडेक्स पुनर्निर्माण और विभाजन स्विच संचालन वास्तव में अवरुद्ध हो सकते हैं।पी>
तो इस वास्तविकता के साथ, SQL Server 2014
WAIT_AT_LOW_PRIORITY
पेश करता है तर्क जिसेMAX_DURATION
. के साथ समायोजित किया जा सकता है औरABORT_AFTER_WAIT
ALTER INDEX
. दोनों के लिए विकल्प औरALTER TABLE
कमांड जिनका उपयोग हम ऑनलाइन इंडेक्स और पार्टीशन स्विच ऑपरेशंस दोनों के लिए कर सकते हैं।यह हमें क्या करने की अनुमति देता है? सबसे पहले, आइए बात करते हैं कि SQL सर्वर 2014 से पहले का व्यवहार क्या था। एक उदाहरण के रूप में, कल्पना कीजिए कि मेरे पास निम्नलिखित लेनदेन खुला और अप्रतिबद्ध है:
लेन-देन शुरू करें; हटाएं [डीबीओ]।[staging_FactInternetSales];अगर मैंने एक
ALTER TABLE SWITCH
करने का प्रयास किया है एक अलग सत्र में एक गंतव्य के रूप में staging_FactInternetSales तालिका में, मुझे अवरुद्ध किया जा रहा है और अनुरोध बस प्रतीक्षा करने वाला है। विशेष रूप से इस उदाहरण के लिए, मैंLCK_M_SCH_M
. के साथ प्रतीक्षा कर रहा हूं प्रतीक्षा प्रकार। एक बार जब मैं रोलबैक या अपना लेन-देन कर लेता हूं, तो ऑपरेशन आगे बढ़ सकता है और पूरा हो सकता है।अब अगर मैं SQL Server 2014 के
WAIT_AT_LOW_PRIORITY
का उपयोग कर रहा हूंMAX_DURATION
. के साथ औरABORT_AFTER_WAIT
, मैं अपनी आवेदन आवश्यकताओं के आधार पर कुछ अलग विकल्पों का लाभ उठा सकता हूं।
MAX_DURATION
मुझे यह निर्दिष्ट करने की अनुमति देता है कि ऑनलाइन इंडेक्स पुनर्निर्माण या विभाजन स्विच ऑपरेशन कितने मिनट तक प्रतीक्षा करेगा। अगरMAX_DURATION
मान पूरा हो गया है, हमABORT_AFTER_WAIT
की सेटिंग के आधार पर यह सेट कर सकते हैं कि आगे क्या होगा , जोNONE
. का मान हो सकता है ,SELF
याBLOCKERS
:
NONE
इसका मतलब है कि इंडेक्स ऑपरेशन ऑपरेशन का प्रयास जारी रखेगा।SELF
इसका मतलब है कि अगरMAX_DURATION
पहुंच गया है, ऑपरेशन (ऑनलाइन इंडेक्स पुनर्निर्माण या विभाजन स्विच) रद्द कर दिया जाएगा।- अगर
BLOCKERS
का उपयोग किया जाता है, यह किसी भी लेन-देन को मार देगा जो ऑनलाइन इंडेक्स पुनर्निर्माण या विभाजन स्विच ऑपरेशन को अवरुद्ध कर रहा है (एक विकल्प नहीं, मेरी राय में, हल्के ढंग से उपयोग करने के लिए)।BLOCKERS
ALTER ANY CONNECTION
. की भी आवश्यकता होती है ऑनलाइन अनुक्रमणिका पुनर्निर्माण या विभाजन स्विच संचालन जारी करने के अनुरोध के लिए अनुमति।
निम्नलिखित कोड उदाहरण विभिन्न कॉन्फ़िगरेशन विविधताओं को प्रदर्शित करते हैं।
2014 से पहले का डिफ़ॉल्ट व्यवहार (अनिश्चित काल तक प्रतीक्षा करें)
- निम्न को निष्पादित करने से वह व्यवहार होगा जो हम पूर्व-एसक्यूएल सर्वर 2014 को देखने के आदी हैं - और यह अभी भी वही हो सकता है जो आप कुछ परिदृश्यों के लिए चाहते हैं या अपेक्षा करते हैं:
वैकल्पिक तालिका [AdventureWorksDW2012]।1 मिनट प्रतीक्षा करें और DDL संचालन रद्द करें
- निम्न उदाहरण 1 मिनट के लिए प्रतीक्षा करता है यदि कोई अवरुद्ध लेनदेन होता है और
SWITCH
के लिए "लॉक अनुरोध समय समाप्त अवधि पार हो गई" प्राप्त होगा अधिकतम अवधि तक पहुंचने पर ऑपरेशन: वैकल्पिक तालिका [AdventureWorksDW2012]।1 मिनट प्रतीक्षा करें और अवरोधक को मारें
- यह उदाहरण 1 मिनट तक प्रतीक्षा करता है यदि कोई अवरुद्ध लेनदेन है और फिर अवरुद्ध लेनदेन (स्रोत या गंतव्य शामिल) को मार देगा, जिससे
SWITCH
की अनुमति मिल जाएगी। ऑपरेशन पूरा करना है। वैकल्पिक तालिका [AdventureWorksDW2012]।मेरे उदाहरण में
DELETE
एक असामान्य लेन-देन के अंदर, मेरे SQL सर्वर प्रबंधन स्टूडियो विंडो में कोई त्रुटि नहीं थी क्योंकि मेरे पास सक्रिय रूप से चलने वाला कथन नहीं था, लेकिन उस सत्र के भीतर एक और कथन का प्रयास करने से निम्न त्रुटि संदेश लौटा (क्योंकि मेरा सत्र समाप्त हो गया था):पी> संदेश 233, स्तर 20, राज्य 0, पंक्ति 3
सर्वर को अनुरोध भेजते समय एक परिवहन-स्तरीय त्रुटि उत्पन्न हुई। (प्रदाता:साझा मेमोरी प्रदाता, त्रुटि:0 - पाइप के दूसरे छोर पर कोई प्रक्रिया नहीं है।)अवरोधक को तुरंत मारें (स्विच के लिए स्रोत या गंतव्य)
- निम्नलिखित अवरोधक को तुरंत मारने का एक उदाहरण है - और मेरे उदाहरण में स्विच उप-सेकंड में हुआ और वास्तव में वह सत्र जो अवरोधक था वह समाप्त हो गया:
ALTER TABLE [AdventureWorksDW2012].[dbo].[FactInternetSales] पार्टिशन 37 को [AdventureWorksDW2012] में बदलें।[dbo]।एक आखिरी सकारात्मक पहलू जिसे मैं बताना चाहता था…
SQL सर्वर त्रुटि लॉग कम प्राथमिकता लॉक प्रतीक्षा उपयोग की कुछ डिफ़ॉल्ट ऑडिटिंग प्रदान करता है, जिसमें
दिनांक 9/10/2013 1:37:15 अपराह्नABORT_AFTER_WAIT
के बारे में जानकारी शामिल है। पीड़ित की जानकारी के साथ इनलाइन संचालन:
लॉग SQL सर्वर (वर्तमान - 9/10/2013 12:03:00 अपराह्न)
स्रोत spid51
संदेश
प्रक्रिया ID 57 को ABORT_AFTER_WAIT =BLOCKERS DDL स्टेटमेंट द्वारा डेटाबेस_आईडी =5, ऑब्जेक्ट_आईडी =309576141 पर मार दिया गया था।और आपको मूल ऑपरेशन के लिए अलग-अलग प्रविष्टियां भी दिखाई देंगी। उदाहरण के लिए:
डेटाबेस 'AdventureWorksDW2012', टेबल 'staging_FactInternetSales' पर होस्टनाम 'WIN-4T7S36VMSD9', होस्ट प्रोसेस आईडी 1360 लक्ष्य तालिका 'AdventureWorksDW2012.dbo.FactInternetSales' पर निष्पादित किया गया था। अवरोधक। प्रतीक्षा समय की अधिकतम अवधि के बाद अवरुद्ध उपयोगकर्ता सत्र समाप्त हो जाएंगे।इस प्रकार की लॉगिंग समस्या निवारण और ऑडिटिंग उद्देश्यों के लिए बहुत उपयोगी है और मुझे इसे देखकर खुशी हुई।