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

SQL सर्वर 2014 वृद्धिशील सांख्यिकी

बेंजामिन नेवारेज़ लॉस एंजिल्स, कैलिफ़ोर्निया में स्थित एक स्वतंत्र सलाहकार हैं जो 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 पर सेट करें ।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DATEFROMPARTS() SQL सर्वर में उदाहरण (T-SQL)

  2. SQL सर्वर डेटाबेस में सभी दृश्यों को सूचीबद्ध करने के 4 तरीके

  3. SQLCommand को पैरामीटर पास करने का सबसे अच्छा तरीका क्या है?

  4. एसक्यूएल सर्वर:ड्रॉप टेबल कैस्केड समकक्ष?

  5. क्या मुझे varchar या int की प्राथमिक कुंजी वाली तालिका डिज़ाइन करनी चाहिए?