SQL सर्वर 2014 CTP1 ऑनलाइन संचालन विकल्पों के लिए एक्सटेंशन पेश करता है जो बहुत बड़े डेटाबेस की मेजबानी करने वाली कंपनियों के लिए अच्छी खबर होगी, जिन्हें कम या बिना डाउनटाइम की आवश्यकता होती है।
संदर्भ सेट करने के लिए, कल्पना करें कि आप ऑनलाइन अनुक्रमणिका प्रबंधन और अनुक्रमणिका विभाजन सुविधाओं के लिए SQL Server 2012 एंटरप्राइज़ संस्करण का उपयोग कर रहे हैं और आप विभाजित तालिका पर निम्न अनुक्रमणिका पुनर्निर्माण का प्रयास करते हैं:
ALTER INDEX [PK_FactInternetSales_SalesOrderNumber_SalesOrderLineNumber] ON [dbo].[FactInternetSales] REBUILD PARTITION = ALL WITH (ONLINE= ON);
SQL सर्वर 2012 में इसका परीक्षण करते हुए, हम बिना किसी त्रुटि के सभी विभाजनों को ऑनलाइन पुनर्निर्माण करने में सक्षम हैं। लेकिन क्या होगा यदि हम सभी विभाजनों के बजाय एक विशिष्ट विभाजन निर्दिष्ट करना चाहते हैं?
ALTER INDEX [PK_FactInternetSales_SalesOrderNumber_SalesOrderLineNumber] ON [dbo].[FactInternetSales] REBUILD PARTITION = 1 WITH (ONLINE= ON);
SQL Server 2012 या इससे पहले के संस्करण में इसका प्रयास करने पर, आपको निम्न त्रुटि संदेश दिखाई देगा:
Msg 155, Level 15, State 1, Line 4'ONLINE' एक मान्यता प्राप्त ALTER INDEX REBUILD PARTITION विकल्प नहीं है।
लेकिन SQL सर्वर 2014 (CTP1 के अनुसार) से शुरू होकर, ऑनलाइन एकल विभाजन अनुक्रमणिका संचालन अब समर्थित हैं। और यह निश्चित रूप से बहुत बड़े टेबल रखरखाव परिदृश्यों के लिए एक बड़ा सौदा है जहां आप पसंद करेंगे, या वास्तव में समय के साथ अपने समग्र रखरखाव को छोटे टुकड़ों में तोड़ देना चाहिए। आप केवल उन विभाजनों के लिए विभाजन-स्तर रखरखाव करना चाह सकते हैं जिनकी वास्तव में इसकी आवश्यकता है - उदाहरण के लिए, वे विभाजन जो वास्तव में एक विशिष्ट विखंडन स्तर से अधिक हैं।
इस SQL सर्वर 2014 CTP1 कार्यक्षमता का परीक्षण करने के लिए मैंने फैक्टइंटरनेटसेल्स के एक संस्करण के साथ AdventureWorksDW2012 का उपयोग किया जिसमें 61,847,552 पंक्तियाँ हैं, और शिपडेट कॉलम द्वारा विभाजित किया गया है।
PARTITION = ALL
. का उपयोग करके तालिका के लिए ऑनलाइन सभी विभाजनों का पुनर्निर्माण करना मेरे परीक्षण के माहौल में 3 मिनट 23 सेकंड का समय लगा। समग्र अवधि के संबंध में, मेरे परीक्षण उन अनुक्रमितों के लिए थे जो सभी खंडित नहीं थे, इसलिए 3 मिनट और 23 सेकंड की अवधि कुछ परीक्षणों पर औसत अवधि का प्रतिनिधित्व करती है। यह भी ध्यान रखें कि मेरे पास उस समय प्रतिस्पर्धी वर्कलोड नहीं चल रहा था, इसलिए ऑनलाइन पुनर्निर्माण प्रश्न में इंडेक्स के खिलाफ अन्य महत्वपूर्ण वर्कलोड के साथ प्रतिस्पर्धा किए बिना हो रहा है।
PARTITION = ALL
. का उपयोग करके ऑनलाइन अनुक्रमणिका के पुनर्निर्माण के लिए क्वेरी निष्पादन योजना आकार इस प्रकार था:
सभी विभाजनों के ऑनलाइन पुनर्निर्माण के लिए निष्पादन योजना
ध्यान दें कि कॉन्स्टेंट स्कैन ऑपरेटर को छोड़कर ऑपरेशन समानांतर-सक्षम हैं। क्वेरी निष्पादन योजना में आप बाहरी संदर्भ कॉन्स्टेंट स्कैन में 39 पंक्तियाँ देख सकते हैं जो डिस्ट्रीब्यूट स्ट्रीम ऑपरेटर को पास की जा रही हैं और फिर नेस्टेड लूप चला रही हैं।
39 पंक्तियों का महत्व? निम्न क्वेरी sys.dm_db_partition_stats
से अधिकतम विभाजन संख्या की पुष्टि करती है . मेरे परीक्षण वातावरण के लिए, अधिकतम विभाजन संख्या के लिए परिणाम 39 था, जो मैंने लगातार स्कैन वास्तविक पंक्तियों के लिए देखा था:
SELECT MAX([partition_number]) AS [max_partition_number] FROM [sys].[dm_db_partition_stats] WHERE [object_id] = OBJECT_ID('FactInternetSales');
अब आप पिछली योजना में ऑनलाइन इंडेक्स इंसर्ट ऑपरेटर को भी देखेंगे। ONLINE = ON
को हटाना मेरे ALTER INDEX REBUILD
. से विकल्प (इसे एक ऑफ़लाइन संचालन बनाते हुए), और PARTITION = ALL
. रखते हुए विकल्प, एकमात्र परिवर्तन क्वेरी निष्पादन योजना में "ऑनलाइन इंडेक्स इंसर्ट" के बजाय एक "इंडेक्स इंसर्ट" ऑपरेटर था - और अवधि में भी कमी, जहां मेरे परीक्षण ने ऑनलाइन की तुलना में 1 मिनट और 9 सेकंड की निष्पादन अवधि दिखाई। 3 मिनट और 23 सेकंड।
इसके बाद मैंने इसके बजाय 5,678,080 पंक्तियों के साथ एक विभाजन के ऑनलाइन पुनर्निर्माण का परीक्षण किया (याद रखें कि कुल तालिका पंक्ति गणना 61,847,552 पंक्तियाँ हैं)। इस परीक्षण के लिए, कुल अवधि में ठीक 1 मिनट का समय लगा और इसमें निम्नलिखित क्वेरी निष्पादन योजना का आकार था:
एकल विभाजन के ऑनलाइन पुनर्निर्माण के लिए निष्पादन योजना
पहला अवलोकन यह है कि यह एक सीरियल प्लान है। यह भी ध्यान दें कि मैंने कहा था कि मैंने मूल 39 में से एक विभाजन को चुना है, हालाँकि उस विशेष विभाजन ने कुल मिलाकर तालिका में ~ 9% पंक्तियों का प्रतिनिधित्व किया है। यह भी ध्यान दें कि कॉन्स्टेंट स्कैन 39 के बजाय 1 पंक्ति दिखाता है, जैसा कि मैं उम्मीद करूंगा।
एकल विभाजन, ऑफ़लाइन पुनर्निर्माण की अवधि के बारे में क्या? मेरे परीक्षण वातावरण में, ऑनलाइन पुनर्निर्माण 1 मिनट की तुलना में इसमें 11 सेकंड का समय लगा। एकल विभाजन के ऑफ़लाइन पुनर्निर्माण के लिए क्वेरी निष्पादन योजना का आकार इस प्रकार था:
एकल विभाजन के ऑफ़लाइन पुनर्निर्माण के लिए निष्पादन योजना
ध्यान दें कि कोई कॉन्स्टेंट स्कैन या संबद्ध नेस्टेड लूप्स प्रक्रिया नहीं है और यह भी ध्यान दें कि इस योजना में अब समानांतर ऑपरेटर हैं, पिछले सीरियल प्लान की तुलना में, भले ही वे दोनों 5,678,080 पंक्तियों के लिए क्लस्टर्ड इंडेक्स स्कैन कर रहे हों। एकल विभाजन ऑफ़लाइन समानांतर अनुक्रमणिका संचालन के लिए XML योजना पाठ में "विभाजन" की खोजशब्द खोज करने से भी कोई मिलान नहीं हुआ - धारावाहिक योजना की तुलना में, ऑनलाइन एकल विभाजन अनुक्रमणिका संचालन जिसमें विभाजन था ="सत्य" के लिए क्लस्टर्ड इंडेक्स स्कैन और ऑनलाइन इंडेक्स भौतिक ऑपरेटरों को सम्मिलित करें।
मुख्य अन्वेषण पर वापस...
क्या मैं एक निष्पादन में कुछ, लेकिन सभी विभाजन नहीं चुन सकता? दुर्भाग्य से नहीं।
ALTER INDEX
और ALTER TABLE
कमांड में PARTITION = ALL
होता है तर्क और फिर PARTITION = <partition number>
तर्क, लेकिन एकल पुनर्निर्माण ऑपरेशन के लिए कई विभाजनों को सूचीबद्ध करने की क्षमता नहीं। हालांकि मैं इस बारे में बहुत जोर से शिकायत नहीं कर रहा हूं, क्योंकि मैं एक एकल विभाजन को ऑनलाइन पुनर्निर्माण करने की क्षमता पाकर खुश हूं और प्रत्येक पुनर्निर्माण के लिए एक बार ऑपरेशन को निष्पादित करना बहुत जटिल नहीं है, हालांकि अवधि के लिए संचयी प्रभाव कुछ था मैं और एक्सप्लोर करना चाहता था।
PARTITION = ALL
के विरुद्ध अलग-अलग और ऑनलाइन सभी 39 विभाजनों को फिर से बनाने में कितना समय लगेगा 3 मिनट और 23 सेकंड की अवधि?
हम जानते हैं कि ऑनलाइन पुनर्निर्माण का लाभ इंडेक्स ऑपरेशन के दौरान अभी भी संबंधित टेबल या इंडेक्स तक पहुंचने की क्षमता है। लेकिन उस ऑनलाइन ऑपरेशन के बदले में, हम ऑफ़लाइन पुनर्निर्माण की तुलना में पुनर्निर्माण के प्रदर्शन किनारे को खो देंगे। और जो मैं आगे जानना चाहता था वह यह था कि एक-एक करके विभाजन ऑनलाइन पुनर्निर्माण कैसे प्रदर्शन करेगा बनाम PARTITION = ALL
वैकल्पिक।
39 अलग-अलग पुनर्निर्माण संचालन (प्रत्येक अद्वितीय विभाजन के लिए एक पुनर्निर्माण) निष्पादित करना, कुल निष्पादन अवधि PARTITION = ALL
की तुलना में 9 मिनट और 54 सेकंड थी। जिसमें 3 मिनट और 23 सेकंड लगे, तो स्पष्ट रूप से टुकड़ा-टुकड़ा दृष्टिकोण संचयी रूप से एक बयान में सभी विभाजनों के ऑनलाइन पुनर्निर्माण जितना तेज़ नहीं है। जबकि मैं एक समय में एक विभाजन करने में सक्षम था, अति-संग्रह लाभ समय के साथ हमारी रखरखाव गतिविधियों को अलग करने और वस्तुओं तक पहुंच बनाए रखने की क्षमता है क्योंकि उन्हें फिर से बनाया जा रहा है, लेकिन यदि आप एक छोटे पुनर्निर्माण की तलाश में हैं विंडो, ऑफ़लाइन विकल्प अभी भी सबसे तेज़ हैं, इसके बाद PARTITION = ALL
. के लिए ऑनलाइन हैं और फिर अंतिम स्थान पर, एक समय में एक विभाजन करना।
निम्न तालिका अवधि तुलनाओं को दोहराती है - और फिर, ये परीक्षण SQL सर्वर 2014 CTP1 और एक बहुत ही विशिष्ट तालिका आकार और VM अतिथि कॉन्फ़िगरेशन पर आधारित थे, इसलिए स्वयं अवधियों के बजाय परीक्षणों में सापेक्ष अवधियों पर अधिक ध्यान दें:
परीक्षण विवरण | <थ>अवधि|
---|---|
सभी विभाजनों का ऑफ़लाइन पुनर्निर्माण | 1:09 |
सभी विभाजनों का ऑनलाइन पुनर्निर्माण | 3:23 |
एक विभाजन का ऑनलाइन पुनर्निर्माण | 1:00 |
एक विभाजन का ऑफ़लाइन पुनर्निर्माण | 0:11 |
सभी विभाजनों का ऑनलाइन पुनर्निर्माण, एक बार में एक विभाजन | 9:54 |
अब इस विषय पर और भी कई पहलुओं का पता लगाया जा सकता है। सिर्फ इसलिए कि एक ऑपरेशन ऑनलाइन है इसका मतलब यह नहीं है कि कुछ क्षण (या उससे अधिक) नहीं हैं जहां लक्षित वस्तु पर अभी भी ताले लगे हैं। इंडेक्स ऑपरेशंस में अभी भी ऑनलाइन ऑपरेशंस के लिए लॉकिंग बिहेवियर है - और SQL सर्वर 2014 ने इसके लिए विकल्प भी प्रदान किए हैं, जिन्हें मैं एक अलग पोस्ट में एक्सप्लोर करूंगा।