Database
 sql >> डेटाबेस >  >> RDS >> Database

वृद्धिशील आँकड़ों के साथ विभाजन रखरखाव में सुधार

SQL सर्वर 2014 कई नई सुविधाएँ लेकर आया है जो DBA और डेवलपर्स अपने वातावरण में परीक्षण और उपयोग करने के लिए तत्पर हैं, जैसे कि अद्यतन करने योग्य क्लस्टर्ड कॉलमस्टोर इंडेक्स, विलंबित स्थायित्व और बफर पूल एक्सटेंशन। एक विशेषता जिस पर अक्सर चर्चा नहीं की जाती है वह है वृद्धिशील आँकड़े। जब तक आप विभाजन का उपयोग नहीं करते हैं, यह एक ऐसी सुविधा नहीं है जिसे आप लागू कर सकते हैं। लेकिन अगर आपके डेटाबेस में विभाजित टेबल हैं, तो वृद्धिशील आंकड़े कुछ ऐसे हो सकते हैं जिनकी आप बेसब्री से उम्मीद कर रहे थे।

नोट:बेंजामिन नेवारेज़ ने अपनी फरवरी 2014 की पोस्ट, SQL सर्वर 2014 इंक्रीमेंटल स्टैटिस्टिक्स में वृद्धिशील आँकड़ों से संबंधित कुछ बुनियादी बातों को शामिल किया। और जबकि उनकी पोस्ट और अप्रैल 2014 की रिलीज़ के बाद से यह सुविधा कैसे काम करती है, इसमें बहुत कुछ नहीं बदला है, यह पता लगाने का एक अच्छा समय है कि कैसे वृद्धिशील आंकड़े सक्षम करने से रखरखाव के प्रदर्शन में मदद मिल सकती है।

वृद्धिशील आँकड़ों को कभी-कभी विभाजन-स्तर आँकड़े कहा जाता है, और ऐसा इसलिए है क्योंकि पहली बार, SQL सर्वर स्वचालित रूप से एक विभाजन के लिए विशिष्ट आँकड़े बना सकता है। विभाजन के साथ पिछली चुनौतियों में से एक यह थी कि, भले ही आपके पास 1 से n . हो सकता था एक तालिका के लिए विभाजन, केवल एक (1) आँकड़ा था जो उन सभी विभाजनों में डेटा वितरण का प्रतिनिधित्व करता था। डेटा के वितरण के बारे में बेहतर जानकारी के साथ क्वेरी ऑप्टिमाइज़र प्रदान करने के लिए आप विभाजित तालिका के लिए फ़िल्टर किए गए आँकड़े बना सकते हैं - प्रत्येक विभाजन के लिए एक आँकड़ा। लेकिन यह एक मैन्युअल प्रक्रिया थी, और प्रत्येक नए विभाजन के लिए उन्हें स्वचालित रूप से बनाने के लिए एक स्क्रिप्ट की आवश्यकता थी।

SQL सर्वर 2014 में, आप STATISTICS_INCREMENTAL . का उपयोग करते हैं SQL सर्वर को उन विभाजन-स्तर के आँकड़े स्वचालित रूप से बनाने का विकल्प। हालांकि, इन आंकड़ों का उपयोग आपके विचार से नहीं किया जाता है।

मैंने पहले उल्लेख किया था कि, 2014 से पहले, आप ऑप्टिमाइज़र को विभाजन के बारे में बेहतर जानकारी देने के लिए फ़िल्टर किए गए आँकड़े बना सकते थे। वे वृद्धिशील आँकड़े? वे वर्तमान में अनुकूलक द्वारा उपयोग नहीं किए जाते हैं। क्वेरी ऑप्टिमाइज़र अभी भी मुख्य हिस्टोग्राम का उपयोग करता है जो संपूर्ण तालिका का प्रतिनिधित्व करता है। (आने वाली पोस्ट जो इसे प्रदर्शित करेगी!)

तो वृद्धिशील आँकड़ों का क्या मतलब है? यदि आप मानते हैं कि सबसे हाल के विभाजन में केवल डेटा बदल रहा है, तो आदर्श रूप से आप केवल उस विभाजन के आंकड़े अपडेट करते हैं। अब आप इसे वृद्धिशील आँकड़ों के साथ कर सकते हैं - और क्या होता है कि जानकारी को फिर मुख्य हिस्टोग्राम में मिला दिया जाता है। संपूर्ण तालिका का हिस्टोग्राम आंकड़ों को अपडेट करने के लिए पूरी तालिका को पढ़े बिना अपडेट हो जाएगा, और यह आपके रखरखाव कार्यों के प्रदर्शन में मदद कर सकता है।

सेटअप

हम एक विभाजन फ़ंक्शन और योजना बनाने के साथ शुरू करेंगे, और फिर एक नई तालिका जिसे हम विभाजित करेंगे। ध्यान दें कि मैंने प्रत्येक विभाजन फ़ंक्शन के लिए एक फ़ाइल समूह बनाया है जैसा कि आप उत्पादन वातावरण में कर सकते हैं। आप उसी फ़ाइल समूह पर विभाजन योजना बना सकते हैं (उदा. PRIMARY ) यदि आप आसानी से अपना परीक्षण डेटाबेस नहीं छोड़ सकते हैं। प्रत्येक फ़ाइल समूह का आकार भी कुछ GB होता है, क्योंकि हम लगभग 400 मिलियन पंक्तियाँ जोड़ने जा रहे हैं।

उपयोग [AdventureWorks2014_Partition];GO /* फाइलग्रुप्स जोड़ें */ALTER DATABASE [AdventureWorks2014_Partition] ADD FILEGROUP [FG2011];ALTER DATABASE [AdventureWorks2014_Partition] ADD FILEGROUP [FG2012];ALTER DATABASE] ADDATABASE [FGBASE] [AdventureWorks2014_Partition] फ़ाइल समूह जोड़ें [FG2014]; डेटाबेस बदलें [AdventureWorks2014_Partition] फ़ाइल समूह जोड़ें [FG2015]; /* फाइल्स जोड़ें फ़ाइलग्रुप [FG2011]; ALTER DATABASE [AdventureWorks2014_Partition] फ़ाइल जोड़ें ( FILENAME =N'C:\Databases\AdventureWorks2014_Partition\2012.ndf', NAME =N'2012', SIZE =512MB, MAXSIZE =2048MB, FILEGROWTH =512MB [FFILEGROWTH =512MB) टू FILEGROUP]; ALTER DATABASE [AdventureWorks2014_Partition] फ़ाइल जोड़ें ( FILENAME =N'C:\Databases\AdventureWorks2014_Partition\2013.ndf', NAME =N'2013', SIZE =2048MB, MAXSIZE =4096MB, FILEGROWTH =512MB [FFILEGROWTH =512MB] 2013 में; ALTER DATABASE [AdventureWorks2014_Partition] फ़ाइल जोड़ें (FILENAME =N'C:\Databases\AdventureWorks2014_Partition\2014.ndf', NAME =N'2014', SIZE =2048MB, MAXSIZE =4096MB, FILEGROWTH =512MB [F FILEGROUP] TO FILEGROUP]; ALTER DATABASE [AdventureWorks2014_Partition] फ़ाइल जोड़ें (FILENAME =N'C:\Databases\AdventureWorks2014_Partition\2015.ndf', NAME =N'2015', SIZE =2048MB, MAXSIZE =4096MB, FILEGROWTH =512MB [F2015GROUP [F2015GROUP] TO FILEGROUP]; /* पार्टीशन फंक्शन बनाएं */पार्टिशन फंक्शन बनाएं [OrderDateRangePFN] ([डेटटाइम]) वैल्यू के लिए रेंज राइट के रूप में ('20110101', - 2011 '20120101' में सब कुछ, - 2012 '20130101' में सब कुछ, - में सब कुछ 2013 '20140101', -- 2014 में सब कुछ '20150101' - 2015 में सब कुछ); GO /* विभाजन योजना बनाएं */विभाजन योजना बनाएं [OrderDateRangePScheme] एक विभाजन के रूप में [OrderDateRangePFN] से ([प्राथमिक], [FG2011], [ FG2012], [FG2013], [FG2014], [FG2015]);जाओ /* तालिका बनाएं */तालिका बनाएं [डीबीओ]। , [VendorID] [int] NULL, [TaxAmt] [पैसा] NULL, [फ्रेट] [पैसा] NULL, [सबटोटल] [पैसा] NULL, [स्टेटस] [टिनींट] नॉट न्यूल, [RevisionNumber] [टिनींट] NULL, [संशोधित दिनांक] [डेटाटाइम] न्यूल, [शिपमेथोडिड] [टिनींट] न्यूल, [शिपडेट] [डेटटाइम] न्यूल नहीं, [ऑर्डरडेट] [डेटाटाइम] न्यूल नहीं, [टोटलड्यू] [पैसा] न्यूल) ऑन [ऑर्डरडेटरेंजपीएसकेम] (ऑर्डरडेट); 

डेटा जोड़ने से पहले, हम क्लस्टर इंडेक्स बनाएंगे, और ध्यान दें कि सिंटैक्स में WITH (STATISTICS_INCREMENTAL = ON) शामिल है। विकल्प:

/* क्लस्टर इंडेक्स जोड़ें और वृद्धिशील आँकड़े सक्षम करें */ALTER TABLE [dbo]। ] ([ऑर्डरडेट]);

यहाँ ध्यान देने योग्य बात यह है कि यदि आप ALTER TABLE . को देखें तो MSDN में प्रविष्टि, इसमें यह विकल्प शामिल नहीं है। आप इसे केवल ALTER INDEX . में पाएंगे प्रवेश ... लेकिन यह काम करता है। यदि आप पत्र के दस्तावेज़ीकरण का पालन करना चाहते हैं, तो आप दौड़ेंगे:

/* क्लस्टर इंडेक्स जोड़ें और वृद्धिशील आंकड़े सक्षम करें */ALTER TABLE [dbo]।;GO ALTER INDEX [OrdersPK] ऑन [dbo]।[आदेश] के साथ फिर से बनाएं (STATISTICS_INCREMENTAL =ON);

एक बार विभाजन योजना के लिए संकुल अनुक्रमणिका बन जाने के बाद, हम अपने डेटा में लोड करेंगे और फिर यह देखने के लिए जाँच करेंगे कि प्रति विभाजन कितनी पंक्तियाँ मौजूद हैं (ध्यान दें कि इसमें 7 मिनट से अधिक लगता है। मेरे लैपटॉप पर, आपके पास कितना संग्रहण (और समय) उपलब्ध है, इसके आधार पर आप कम पंक्तियाँ जोड़ना चाह सकते हैं:

/* कुछ डेटा लोड करें */NOCOUNT ON करें;DECLARE @Loops SMALLINT =0;DECLARE @Increment INT =5000; जबकि @Loops <10000 -- तालिका में पंक्तियों की संख्या बढ़ाने या घटाने के लिए इसे समायोजित करें, 10000 =40 मिलियन पंक्तियाँ INSERT [dbo]। TaxAmt] ,[Freight] ,[SubTotal] ,[Status] ,[RevisionNumber] ,[ModifiedDate] ,[ShipMethodID] ,[ShipDate] ,[OrderDate] ,[TotalDue] ) चुनें [PurchaseOrderID] + @Increment] , [VendorID] , [TaxAmt] , [Freight] , [SubTotal] , [Status] , [RevisionNumber] , [ModifiedDate] , [ShipMethodID] , [ShipDate] , [OrderDate] , [TotalDue] FROM [क्रय खरीद ऑर्डर हैडर]; चौकी; सेट @ लूप्स =@ लूप्स + 1; SET @Increment =@Increment + 5000;END /* यह देखने के लिए जांचें कि प्रति विभाजन कितना डेटा मौजूद है */$ PARTITION चुनें। [ऑर्डरडेट]) एएस [मिन_ऑर्डर_डेट], मैक्स ([ओ]। [ऑर्डरडेट]) एएस [मैक्स_ऑर्डर_डेट], काउंट (*) एएस [विभाजन में पंक्तियां] [डीबीओ] से। विभाजन। [ऑर्डरडेटरेंजपीएफएन]([ओ]। [ऑर्डरडेट]) [विभाजन संख्या] द्वारा आदेश; 

प्रति विभाजन डेटा

हमने 2012 से 2015 के लिए डेटा जोड़ा है, 2014 और 2015 में काफी अधिक डेटा के साथ। आइए देखें कि हमारे आंकड़े कैसे दिखते हैं:

DBCC SHOW_STATISTICS ('dbo.Orders',[OrdersPK]);

dbo.Orders के लिए DBCC SHOW_STATISTICS आउटपुट (विस्तार करने के लिए क्लिक करें)

डिफ़ॉल्ट DBCC SHOW_STATISTICS . के साथ आदेश, हमारे पास विभाजन स्तर पर आँकड़ों के बारे में कोई जानकारी नहीं है। डर नहीं; हम पूरी तरह से बर्बाद नहीं हुए हैं - एक अनियंत्रित गतिशील प्रबंधन कार्य है, sys.dm_db_stats_properties_internal . याद रखें कि अनिर्दिष्ट का अर्थ है कि यह समर्थित नहीं है (DMF के लिए कोई MSDN प्रविष्टि नहीं है), और यह कि यह Microsoft से किसी भी चेतावनी के बिना किसी भी समय बदल सकता है। उस ने कहा, हमारे वृद्धिशील आँकड़ों के लिए क्या मौजूद है, इसका अंदाजा लगाने के लिए यह एक अच्छी शुरुआत है:

चुनें * [sys] से।[dm_db_stats_properties_internal](OBJECT_ID('dbo.Orders'),1) [node_id] से ऑर्डर करें;

dm_db_stats_properties_internal से हिस्टोग्राम जानकारी (विस्तार करने के लिए क्लिक करें)

यह बहुत अधिक दिलचस्प है। यहां हम सबूत देख सकते हैं कि विभाजन-स्तर के आंकड़े (और अधिक) मौजूद हैं। चूंकि यह डीएमएफ प्रलेखित नहीं है, इसलिए हमें कुछ व्याख्या करनी होगी। आज के लिए, हम आउटपुट में पहली सात पंक्तियों पर ध्यान केंद्रित करेंगे, जहां पहली पंक्ति संपूर्ण तालिका के लिए हिस्टोग्राम का प्रतिनिधित्व करती है (rows पर ध्यान दें) 40 मिलियन का मान), और बाद की पंक्तियाँ प्रत्येक विभाजन के लिए हिस्टोग्राम का प्रतिनिधित्व करती हैं। दुर्भाग्य से, partition_number इस हिस्टोग्राम में मान sys.dm_db_index_physical_stats से विभाजन संख्या के अनुरूप नहीं है दाएं-आधारित विभाजन के लिए (यह बाएं-आधारित विभाजन के लिए ठीक से सहसंबंधित है)। यह भी ध्यान दें कि इस आउटपुट में last_updated . भी शामिल है और modification_counter कॉलम, जो समस्या निवारण में सहायक होते हैं, और इसका उपयोग रखरखाव स्क्रिप्ट विकसित करने के लिए किया जा सकता है जो उम्र या पंक्ति संशोधनों के आधार पर समझदारी से आंकड़े अपडेट करते हैं।

न्यूनतम रखरखाव आवश्यक

इस समय वृद्धिशील आँकड़ों का प्राथमिक मूल्य एक विभाजन के लिए आँकड़ों को अद्यतन करने की क्षमता है और उन्हें तालिका-स्तर के हिस्टोग्राम में विलय कर दिया जाता है, बिना संपूर्ण तालिका के आंकड़ों को अद्यतन करने के लिए (और इसलिए संपूर्ण तालिका के माध्यम से पढ़ा जाता है)। इसे क्रियान्वित करने के लिए, आइए पहले उस विभाजन के आंकड़े अपडेट करें जिसमें 2015 डेटा, विभाजन 5 है, और हम लिए गए समय को रिकॉर्ड करेंगे और sys.dm_io_virtual_file_stats का स्नैपशॉट लेंगे। DMF पहले और बाद में देखें कि कितना I/O होता है:

सांख्यिकी समय चालू करें; fs.database_id, fs.file_id, mf.name, mf.physical_name, fs.num_of_bytes_read, fs.num_of_bytes_writeINTO #FirstCaptureFROM sys.dm_io_virtual_file_stats(DB_ID(), NULL) के रूप में fsINNER JOIN के रूप में चुनें। .database_id और fs.file_id =mf.file_id; अद्यतन आंकड़े [डीबीओ]। [आदेश] ([आदेशपीके]) विभाजन पर नमूने के साथ (6); जाओ चयन करें fs.database_id, fs.file_id, mf.name, mf. Physical_name, fs.num_of_bytes_read, fs.num_of_bytes_writeINTO #SecondCaptureFROM #SecondCaptureFs. .dm_io_virtual_file_stats(DB_ID(), NULL) fsINNER के रूप में sys.master_files के रूप में fs.database_id =mf.database_id और fs.file_id =mf.file_id पर एमएफ के रूप में शामिल हों; f.file_id, f.name, f.physical_name, (s.num_of_bytes_read - f.num_of_bytes_read)/1024 MB_पढ़ें, (s.num_of_bytes_लिखित - f.num_of_bytes_लिखित)/1024 MB_लिखा गया चुनें। database_id =s.database_id और f.file_id =s.file_id;

आउटपुट:

SQL सर्वर निष्पादन समय:
CPU समय =203 ms, बीता हुआ समय =240 ms।

एक पार्टीशन को अपडेट करने के बाद File_stats डेटा

अगर हम देखें sys.dm_db_stats_properties_internal आउटपुट, हम देखते हैं कि last_updated 2015 के हिस्टोग्राम और टेबल-लेवल हिस्टोग्राम (साथ ही कुछ अन्य नोड्स, जो बाद में जांच के लिए है) दोनों के लिए बदला गया:

dm_db_stats_properties_internal से अपडेट की गई हिस्टोग्राम जानकारी

अब हम FULLSCAN . के साथ आंकड़े अपडेट करेंगे तालिका के लिए, और हम file_stats को पहले और बाद में स्नैपशॉट करेंगे:

सांख्यिकी समय चालू करें; fs.database_id, fs.file_id, mf.name, mf.भौतिक_नाम, fs.num_of_bytes_read, fs.num_of_bytes_writeINTO #FirstCapture2FROM sys.dm_io_virtual_file_stats(DB_ID(), NULL) के रूप में fsINNER JOIN AS sys. .database_id और fs.file_id =mf.file_id; अद्यतन आंकड़े [डीबीओ]। [आदेश] ([ऑर्डरपीके]) फुलस्कैन के साथ चयन करें fs.database_id, fs.file_id, mf.name, mf. Physical_name, fs.num_of_bytes_read, fs.num_of_bytes_statinTO #SecondCapture2FROM sys. NULL) fsINNER के रूप में sys.master_files के रूप में mf पर fs.database_id =mf.database_id और fs.file_id =mf.file_id; चुनें f.file_id, f.name, f. Physical_name, (s.num_of_bytes_read - f.num_of_bytes_read)/1024 MB_पढ़ें, (s.num_of_bytes_लिखित - f.num_of_bytes_लिखित)/1024 MB_RittenFROM #FirstCapture2 AS fINNER JOIN #SecondCapture2 F. database_id =s.database_id और f.file_id =s.file_id;

आउटपुट:

SQL सर्वर निष्पादन समय:
CPU समय =12720 ms, बीता हुआ समय =13646 ms

फ़ुलस्कैन से अपडेट करने के बाद डेटा को फ़ाइल करें

अद्यतन में काफी अधिक समय लगा (13 सेकंड बनाम कुछ सौ मिलीसेकंड) और बहुत अधिक I/O उत्पन्न किया। अगर हम sys.dm_db_stats_properties_internal . की जांच करते हैं फिर से, हम पाते हैं कि last_updated सभी हिस्टोग्राम के लिए बदला गया:

एक पूर्ण स्कैन के बाद dm_db_stats_properties_internal से हिस्टोग्राम जानकारी

सारांश

जबकि वृद्धिशील आँकड़े अभी तक प्रत्येक विभाजन के बारे में जानकारी प्रदान करने के लिए क्वेरी अनुकूलक द्वारा उपयोग नहीं किए जाते हैं, वे विभाजित तालिकाओं के लिए आँकड़ों का प्रबंधन करते समय एक प्रदर्शन लाभ प्रदान करते हैं। यदि आँकड़ों को केवल चुनिंदा विभाजनों के लिए अद्यतन करने की आवश्यकता है, तो बस उन्हें अद्यतन किया जा सकता है। नई जानकारी को तब तालिका-स्तरीय हिस्टोग्राम में मिला दिया जाता है, जिससे ऑप्टिमाइज़र को संपूर्ण तालिका को पढ़ने की लागत के बिना अधिक वर्तमान जानकारी मिलती है। आगे बढ़ते हुए, हम आशा करते हैं कि वे विभाजन-स्तरीय आँकड़े करेंगे अनुकूलक द्वारा उपयोग किया जा सकता है। बने रहें…


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PSDatabaseClone के साथ क्लोनिंग डेटाबेस

  2. SQL ग्रुप बाय स्टेटमेंट का उपयोग क्या है?

  3. एसक्यूएल में आईएफ स्टेटमेंट कैसे करें?

  4. अल्फा एनीवेयर में Salesforce.com के साथ कार्य करना

  5. Azure कंटेनर सेवा पर डॉकर झुंड क्लस्टर बनाना