अद्वितीय सूचकांक अपडेट और सांख्यिकी पंक्ति संशोधन काउंटर


14

निम्नलिखित तालिका को देखते हुए, अद्वितीय क्लस्टर इंडेक्स, और आँकड़े:

CREATE TABLE dbo.Banana
(
    pk integer NOT NULL, 
    c1 char(1) NOT NULL, 
    c2 char(1) NOT NULL
);

CREATE UNIQUE CLUSTERED INDEX pk ON dbo.Banana (pk);

CREATE STATISTICS c1 ON dbo.Banana (c1);
CREATE STATISTICS c2 ON dbo.Banana (c2);

INSERT dbo.Banana 
    (pk, c1, c2) 
VALUES 
    (1, 'A', 'W'), 
    (2, 'B', 'X'), 
    (3, 'C', 'Y'), 
    (4, 'D', 'Z');

-- Populate statistics
UPDATE STATISTICS dbo.Banana;

उदाहरण डेटा

सांख्यिकी पंक्ति संशोधन काउंटर स्पष्ट रूप से किसी भी अपडेट से पहले शून्य दिखाते हैं:

-- Show statistics modification counters
SELECT
    stats_name = S.[name], 
    DDSP.stats_id,
    DDSP.[rows],
    DDSP.modification_counter
FROM sys.stats AS S
CROSS APPLY sys.dm_db_stats_properties(S.object_id, S.stats_id) AS DDSP
WHERE
    S.[object_id] = OBJECT_ID(N'dbo.Banana', N'U');

शून्य संशोधन काउंटर

प्रत्येक pkपंक्ति के लिए प्रत्येक स्तंभ मान बढ़ाएँ:

-- Increment pk in every row
UPDATE dbo.Banana 
SET pk += 1;

निष्पादन योजना का उपयोग करता है:

स्प्लिट सॉर्ट संक्षिप्त निष्पादन योजना

यह निम्नलिखित सांख्यिकी संशोधन काउंटर का उत्पादन करता है:

पोस्ट-अपडेट संशोधन काउंटर

प्रशन

  1. स्प्लिट, सॉर्ट, और संकुचित ऑपरेटर क्या करते हैं?
  2. क्यों pkआँकड़े 2 संशोधनों को दिखाने लेकिन, c1और c2दिखाने के 5?

जवाबों:


15

SQL सर्वर हमेशा एक से अधिक पंक्ति को प्रभावित (या प्रभावित कर सकता है) को अद्यतन करने वाले भाग के रूप में एक अद्वितीय अनुक्रमणिका बनाए रखने के लिए आपरेटरों के स्प्लिट, सॉर्ट और संक्षिप्त संयोजन का उपयोग करता है ।

प्रश्न में उदाहरण के माध्यम से कार्य करते हुए, हम अद्यतन को उपस्थित प्रत्येक चार पंक्तियों के लिए एक अलग एकल-पंक्ति अद्यतन के रूप में लिख सकते हैं:

-- Per row updates
UPDATE dbo.Banana SET pk = 2 WHERE pk = 1;
UPDATE dbo.Banana SET pk = 3 WHERE pk = 2;
UPDATE dbo.Banana SET pk = 4 WHERE pk = 3;
UPDATE dbo.Banana SET pk = 5 WHERE pk = 4;

समस्या यह है कि पहला बयान विफल हो जाएगा, क्योंकि यह pk1 से 2 तक बदल जाता है, और पहले से ही एक पंक्ति है जहां pk= 2. SQL सर्वर भंडारण इंजन को यह आवश्यक है कि प्रसंस्करण के हर चरण में अद्वितीय अनुक्रमित अद्वितीय रहें, यहां तक ​​कि एक बयान के भीतर भी। । यह स्प्लिट, सॉर्ट और संक्षिप्त द्वारा हल की गई समस्या है।

विभाजित करें विभाजित करें

पहला कदम हर अपडेट स्टेटमेंट को डिलीट करने के लिए एक इन्सर्ट के बाद स्प्लिट करना है:

DELETE dbo.Banana WHERE pk = 1;
INSERT dbo.Banana (pk, c1, c2) VALUES (2, 'A', 'W');

DELETE dbo.Banana WHERE pk = 2;
INSERT dbo.Banana (pk, c1, c2) VALUES (3, 'B', 'X');

DELETE dbo.Banana WHERE pk = 3;
INSERT dbo.Banana (pk, c1, c2) VALUES (4, 'C', 'Y');

DELETE dbo.Banana WHERE pk = 4;
INSERT dbo.Banana (pk, c1, c2) VALUES (5, 'D', 'Z');

स्प्लिट ऑपरेटर स्ट्रीम में एक एक्शन कोड कॉलम जोड़ता है (यहां पर एक्ट 1007 को लेबल किया गया है):

विभाजन गुण

एक्शन कोड अपडेट के लिए 1, डिलीट के लिए 3 और इंसर्ट के लिए 4 है।

तरह तरह

ऊपर दिए गए विभाजन के बयान अभी भी एक गलत क्षणिक अद्वितीय कुंजी उल्लंघन उत्पन्न करेंगे, इसलिए अगला चरण अद्वितीय सूचकांक की कुंजी द्वारा बयानों को क्रमबद्ध करना है ( pkइस मामले में) अपडेट किया जा रहा है , फिर कार्रवाई कोड द्वारा। इस उदाहरण के लिए, इसका मतलब यह है कि आवेषण (4) से पहले उसी कुंजी को हटा दिया जाता है (3)। परिणामी क्रम है:

-- Sort (pk, action)
DELETE dbo.Banana WHERE pk = 1;
DELETE dbo.Banana WHERE pk = 2;
INSERT dbo.Banana (pk, c1, c2) VALUES (2, 'A', 'W');
DELETE dbo.Banana WHERE pk = 3;
INSERT dbo.Banana (pk, c1, c2) VALUES (3, 'B', 'X');
DELETE dbo.Banana WHERE pk = 4;
INSERT dbo.Banana (pk, c1, c2) VALUES (4, 'C', 'Y');
INSERT dbo.Banana (pk, c1, c2) VALUES (5, 'D', 'Z');

गुणों को क्रमबद्ध करें

ढहने ढहने

पूर्ववर्ती चरण सभी मामलों में झूठी विशिष्टता के उल्लंघन से बचने के लिए पर्याप्त है। एक अनुकूलन के रूप में, समीपवर्ती विलोपन और आवेषण को एक अद्यतन में समान कुंजी मान पर संक्षिप्त करें:

-- Collapse (pk)
DELETE dbo.Banana WHERE pk = 1;
UPDATE dbo.Banana SET c1 = 'A', c2 = 'W' WHERE pk = 2;
UPDATE dbo.Banana SET c1 = 'B', c2 = 'X' WHERE pk = 3;
UPDATE dbo.Banana SET c1 = 'C', c2 = 'Y' WHERE pk = 4;
INSERT dbo.Banana (pk, c1, c2) VALUES (5, 'D', 'Z');

pkमान 2, 3 और 4 के लिए जोड़े / हटाएं को अपडेट में जोड़ दिया गया है, जिससे pk= 1 पर एक भी डिलीट हो जाएगा और pk= 5 के लिए एक इंसर्ट हो जाएगा ।

कुंजी कॉलम द्वारा ऑपरेटर को पंक्तियों को संकुचित करें, और पतन के परिणाम को प्रतिबिंबित करने के लिए क्रिया कोड को अपडेट करता है:

संपत्तियों को संकुचित करें

क्लस्टर इंडेक्स अपडेट क्लस्टर इंडेक्स अपडेट

इस ऑपरेटर को एक अद्यतन के रूप में लेबल किया गया है, लेकिन यह आवेषण, अद्यतन और हटाने में सक्षम है। प्रति पंक्ति क्लस्टर्ड इंडेक्स अपडेट द्वारा कौन सी कार्रवाई की जाती है यह उस पंक्ति में एक्शन कोड के मूल्य से निर्धारित होता है। ऑपरेटर के पास ऑपरेशन के इस मोड को दर्शाने के लिए एक एक्शन प्रॉपर्टी है:

संकुल अनुक्रमणिका अद्यतन क्रिया गुण


पंक्ति संशोधन काउंटर

ध्यान दें कि ऊपर दिए गए तीन अपडेट अद्वितीय अनुरक्षण की कुंजी (एस) को संशोधित नहीं करते हैं । वास्तव में, हमने इंडेक्स के प्रमुख कॉलमों को गैर-कुंजी कॉलमों ( c1और c2) के अपडेट में बदल दिया है , साथ ही एक डिलीट और एक इंसर्ट को भी बदल दिया है। न तो डिलीट और न ही इंसर्ट एक गलत यूनीक-की का उल्लंघन हो सकता है।

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

इसलिए सांख्यिकी पंक्ति संशोधन काउंटरों में 2 परिवर्तन होते हैं pk, और 5 c1और c2:

-- Collapse (pk)
DELETE dbo.Banana WHERE pk = 1;                         -- All columns modified
UPDATE dbo.Banana SET c1 = 'A', c2 = 'W' WHERE pk = 2;  -- c1 and c2 modified
UPDATE dbo.Banana SET c1 = 'B', c2 = 'X' WHERE pk = 3;  -- c1 and c2 modified
UPDATE dbo.Banana SET c1 = 'C', c2 = 'Y' WHERE pk = 4;  -- c1 and c2 modified
INSERT dbo.Banana (pk, c1, c2) VALUES (5, 'D', 'Z');    -- All columns modified

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

यदि किसी ऑब्जेक्ट में कई अनूठे इंडेक्स हैं, तो प्रत्येक को अपडेट को व्यवस्थित करने के लिए एक अलग स्प्लिट, सॉर्ट, संक्षिप्त संयोजन का उपयोग किया जाता है। SQL सर्वर स्प्लिट के परिणामस्वरूप एगर टेबल स्पूल के परिणाम को सहेजकर नॉनक्लेस्टेड इंडेक्स के लिए इस मामले का अनुकूलन करता है, फिर उस सेट को प्रत्येक अनूठे इंडेक्स के लिए रीप्ले करना (जिसमें इंडेक्स कीज़ + एक्शन कोड, और संक्षिप्तता के आधार पर उसका अपना सॉर्ट होगा)।

आँकड़े अद्यतन पर प्रभाव

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

स्प्लिट / सॉर्ट / संक्षिप्त व्यवस्था परिणाम की अपेक्षा की जाने वाली विभिन्न पंक्ति संशोधनों में दर्ज किया जाएगा। यह, बदले में, इसका मतलब है कि एक आँकड़े अद्यतन को जल्दी या बाद में ट्रिगर किया जा सकता है अन्यथा मामला होगा।

ऊपर दिए गए उदाहरण में, कुंजी स्तंभ के लिए पंक्ति में संशोधन 2 (शुद्ध परिवर्तन) के बजाय 4 (प्रत्येक तालिका पंक्ति प्रभावित के लिए एक), या 5 (प्रत्येक डिलीट / अपडेट / पतन द्वारा निर्मित सम्मिलित करें) के लिए होता है।

इसके अलावा, गैर-कुंजी कॉलम जो तार्किक रूप से मूल क्वेरी द्वारा नहीं बदले गए थे , पंक्ति संशोधनों को जमा करते हैं, जो कि अपडेट की गई तालिका पंक्तियों को दोगुना कर सकते हैं (प्रत्येक डिलीट के लिए एक, और प्रत्येक प्रविष्टि के लिए एक)।


दर्ज किए गए परिवर्तनों की संख्या पुराने और नए कुंजी कॉलम मानों के बीच ओवरलैप की डिग्री पर निर्भर करती है (और इसलिए डिग्री अलग-अलग डिलीट और आवेषण ढह सकती है)। प्रत्येक निष्पादन के बीच तालिका को रीसेट करते हुए, निम्नलिखित प्रश्न अलग-अलग ओवरलैप के साथ पंक्ति संशोधन काउंटर पर प्रभाव प्रदर्शित करते हैं:

UPDATE dbo.Banana SET pk = pk + 0; -- Full overlap

पीके = पीके + ०

UPDATE dbo.Banana SET pk = pk + 1;

pk = pk + १

UPDATE dbo.Banana SET pk = pk + 2;

pk = pk + २

UPDATE dbo.Banana SET pk = pk + 3;

पीके = पीके + ३

UPDATE dbo.Banana SET pk = pk + 4; -- No overlap

पीके = पीके + ४

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.