बेंजामिन नेवारेज़ लॉस एंजिल्स, कैलिफ़ोर्निया में स्थित एक स्वतंत्र सलाहकार हैं जो SQL सर्वर क्वेरी ट्यूनिंग और अनुकूलन में माहिर हैं। वह "एसक्यूएल सर्वर 2014 क्वेरी ट्यूनिंग और ऑप्टिमाइज़ेशन" और "इनसाइड द एसक्यूएल सर्वर क्वेरी ऑप्टिमाइज़र" के लेखक हैं और "एसक्यूएल सर्वर 2012 इंटर्नल्स" के सह-लेखक हैं। रिलेशनल डेटाबेस में 20 से अधिक वर्षों के अनुभव के साथ, बेंजामिन कई SQL सर्वर सम्मेलनों में एक वक्ता भी रहे हैं, जिसमें PASS समिट, SQL सर्वर कनेक्शन और SQLBits शामिल हैं। बेंजामिन का ब्लॉग http://www.benjaminnevarez.com पर पाया जा सकता है और उस तक बेंजामिननेवारेज़ डॉट कॉम पर व्यवस्थापक और @BenjaminNevarez पर ट्विटर पर ई-मेल द्वारा भी पहुंचा जा सकता है।
SQL सर्वर में बड़ी तालिकाओं में आँकड़ों को अद्यतन करने में एक बड़ी समस्या यह है कि पूरी तालिका को हमेशा स्कैन करना पड़ता है, उदाहरण के लिए WITH FULLSCAN
का उपयोग करते समय विकल्प, भले ही हाल ही का डेटा बदल गया हो। विभाजन का उपयोग करते समय यह भी सच है:भले ही पिछली बार के आंकड़ों के अद्यतन होने के बाद से केवल नवीनतम विभाजन बदल गया हो, फिर भी उन सभी विभाजनों सहित संपूर्ण तालिका को स्कैन करने के लिए आवश्यक आँकड़ों को अद्यतन करना जो नहीं बदले। वृद्धिशील आँकड़े, एक नई SQL सर्वर 2014 सुविधा, इस समस्या से निपटने में मदद कर सकती है।
वृद्धिशील आँकड़ों का उपयोग करके आप केवल उस विभाजन या विभाजन को अद्यतन कर सकते हैं जिसकी आपको आवश्यकता है और इन विभाजनों की जानकारी को अंतिम आँकड़े वस्तु बनाने के लिए मौजूदा जानकारी के साथ मिला दिया जाएगा। वृद्धिशील आँकड़ों का एक अन्य लाभ यह है कि आंकड़ों के स्वत:अद्यतन को ट्रिगर करने के लिए आवश्यक डेटा परिवर्तनों का प्रतिशत अब विभाजन स्तर पर काम करता है जिसका मूल रूप से मतलब है कि अब प्रति विभाजन केवल 20% पंक्तियों में परिवर्तन (अग्रणी सांख्यिकी कॉलम पर परिवर्तन) की आवश्यकता है। दुर्भाग्य से हिस्टोग्राम अभी भी SQL सर्वर के इस संस्करण में संपूर्ण सांख्यिकी ऑब्जेक्ट के लिए 200 चरणों तक सीमित है।
आइए एक उदाहरण देखें कि आप कम से कम SQL Server 2014 CTP2 के व्यवहार का पता लगाने के लिए विभाजन स्तर पर आँकड़ों को कैसे अपडेट कर सकते हैं। सबसे पहले हमें AdventureWorks2012 डेटाबेस का उपयोग करके एक विभाजित तालिका बनाने की आवश्यकता है:
CREATE PARTITION FUNCTION TransactionRangePF1 (DATETIME) AS RANGE RIGHT FOR VALUES ( '20071001', '20071101', '20071201', '20080101', '20080201', '20080301', '20080401', '20080501', '20080601', '20080701', '20080801' ); GO CREATE PARTITION SCHEME TransactionsPS1 AS PARTITION TransactionRangePF1 TO ( [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY] ); GO CREATE TABLE dbo.TransactionHistory ( TransactionID INT NOT NULL, -- not bothering with IDENTITY here ProductID INT NOT NULL, ReferenceOrderID INT NOT NULL, ReferenceOrderLineID INT NOT NULL DEFAULT (0), TransactionDate DATETIME NOT NULL DEFAULT (GETDATE()), TransactionType NCHAR(1) NOT NULL, Quantity INT NOT NULL, ActualCost MONEY NOT NULL, ModifiedDate DATETIME NOT NULL DEFAULT (GETDATE()), CONSTRAINT CK_TransactionType CHECK (UPPER(TransactionType) IN (N'W', N'S', N'P')) ) ON TransactionsPS1 (TransactionDate); GO
नोट:विभाजन और CREATE PARTITION FUNCTION / SCHEME
के बारे में विवरण के लिए विवरण कृपया ऑनलाइन पुस्तकों में विभाजित तालिकाएँ और अनुक्रमणिका देखें।
वर्तमान में हमारे पास 12 विभाजनों को भरने के लिए डेटा है। आइए पहले केवल 11 को पॉप्युलेट करके शुरू करें।
INSERT INTO dbo.TransactionHistory SELECT * FROM Production.TransactionHistory WHERE TransactionDate < '2008-08-01';
यदि आवश्यक हो, तो आप विभाजन की सामग्री का निरीक्षण करने के लिए निम्नलिखित कथन का उपयोग कर सकते हैं:
SELECT * FROM sys.partitions WHERE object_id = OBJECT_ID('dbo.TransactionHistory');
आइए CREATE STATISTICS
. का उपयोग करके एक वृद्धिशील सांख्यिकी ऑब्जेक्ट बनाएं नए INCREMENTAL
. के साथ स्टेटमेंट क्लॉज ON
पर सेट है (OFF
डिफ़ॉल्ट है):
CREATE STATISTICS incrstats ON dbo.TransactionHistory(TransactionDate) WITH FULLSCAN, INCREMENTAL = ON;
आप नए STATISTICS_INCREMENTAL
का उपयोग करके अनुक्रमणिका बनाते समय वृद्धिशील आंकड़े भी बना सकते हैं CREATE INDEX
. का खंड बयान।
आप DBCC
. का उपयोग करके बनाए गए सांख्यिकी ऑब्जेक्ट का निरीक्षण कर सकते हैं :
DBCC SHOW_STATISTICS('dbo.TransactionHistory', incrstats);
अन्य बातों के अलावा, आप देखेंगे कि हिस्टोग्राम में 200 चरण हैं (केवल अंतिम 3 यहाँ दिखाए गए हैं):
RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | |
198 | 2008-07-25 00:00:00.000 | 187 | 100 | 2 |
199 | 2008-07-27 00:00:00.000 | 103 | 101 | 1 |
200 | 2008-07-31 00:00:00.000 | 281 | 131 | 3 |
प्रारंभिक DBCC परिणाम
इसलिए हमारे पास पहले से ही एक सांख्यिकी वस्तु में अधिकतम चरण हैं। यदि आप किसी नए विभाजन में डेटा जोड़ते हैं तो क्या होगा? आइए हम विभाजन 12 में डेटा जोड़ें:
INSERT INTO dbo.TransactionHistory SELECT * FROM Production.TransactionHistory WHERE TransactionDate >= '2008-08-01';
अब, हम निम्नलिखित कथन का उपयोग करके सांख्यिकी ऑब्जेक्ट को अपडेट करते हैं:
UPDATE STATISTICS dbo.TransactionHistory(incrstats) WITH RESAMPLE ON PARTITIONS(12);
विभाजन को निर्दिष्ट करने वाले नए सिंटैक्स पर ध्यान दें, जहां आप अल्पविराम द्वारा अलग किए गए कई विभाजन निर्दिष्ट कर सकते हैं। UPDATE STATISTICS
कथन निर्दिष्ट विभाजनों को पढ़ता है और फिर वैश्विक आंकड़ों के निर्माण के लिए उनके परिणामों को मौजूदा सांख्यिकीय वस्तु के साथ मिला देता है। RESAMPLE
पर ध्यान दें खंड; यह आवश्यक है क्योंकि वैश्विक आँकड़ों के निर्माण के लिए विभाजन के आँकड़ों को समान नमूना दरों की आवश्यकता होती है। यद्यपि केवल निर्दिष्ट विभाजन स्कैन किया गया था, आप देख सकते हैं कि SQL सर्वर ने हिस्टोग्राम को पुनर्व्यवस्थित किया है। अंतिम तीन चरण अब जोड़े गए विभाजन के लिए डेटा दिखाते हैं। अन्य मामूली अंतरों के लिए आप मूल की तुलना नए हिस्टोग्राम से भी कर सकते हैं:
RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | |
197 | 2008-07-31 00:00:00.000 | 150 | 131 | 2 |
198 | 2008-08-12 00:00:00.000 | 300 | 36 | 9 |
199 | 2008-08-22 00:00:00.000 | 229 | 43 | 7 |
200 | 2008-09-03 00:00:00.000 | 363 | 37 | 11 |
DBCC परिणाम वृद्धिशील अद्यतन के बाद
यदि किसी कारण से आप वृद्धिशील आँकड़ों को अक्षम करना चाहते हैं तो आप मूल व्यवहार पर वापस जाने के लिए निम्नलिखित कथन का उपयोग कर सकते हैं (या वैकल्पिक रूप से केवल आँकड़े ऑब्जेक्ट को छोड़ दें और एक नया बनाएँ)।
UPDATE STATISTICS dbo.TransactionHistory(incrstats) WITH FULLSCAN, INCREMENTAL = OFF;
वृद्धिशील आँकड़ों को अक्षम करने के बाद विभाजन को अद्यतन करने का प्रयास कर रहा है जैसा कि पहले दिखाया गया है, निम्न त्रुटि संदेश लौटाएगा:
संदेश 9111, स्तर 16, राज्य 1विभाजनों पर अद्यतन आँकड़े सिंटैक्स गैर-वृद्धिशील आँकड़ों के लिए समर्थित नहीं है।
अंत में, यदि आवश्यक हो, तो आप डेटाबेस स्तर पर अपने स्वचालित आँकड़ों के लिए वृद्धिशील आँकड़े भी सक्षम कर सकते हैं। इसके लिए INCREMENTAL = ON
की आवश्यकता है ALTER DATABASE
में क्लॉज कथन और स्पष्ट रूप से AUTO_CREATE_STATISTICS
. की भी आवश्यकता है ON
पर सेट करें ।