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;
समस्या यह है कि पहला बयान विफल हो जाएगा, क्योंकि यह pk
1 से 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;
UPDATE dbo.Banana SET pk = pk + 2;
UPDATE dbo.Banana SET pk = pk + 3;
UPDATE dbo.Banana SET pk = pk + 4; -- No overlap