एक डिफ़ॉल्ट बाधा के साथ एक नॉट कॉलम को तत्काल क्यों जोड़ा जा रहा है?


16
CREATE TABLE TestTab (ID INT IDENTITY(1,1), st nvarchar(100))

INSERT INTO TestTab (st) values ('a')
INSERT INTO TestTab (st) values ('b')
INSERT INTO TestTab (st) values ('c')
INSERT INTO TestTab (st) values ('d')
INSERT INTO TestTab (st) values ('e')

INSERT INTO TestTab (st) SELECT TOP 10000 st from testtab
GO 30

ALTER TABLE TestTab ADD newcol nvarchar(10) DEFAULT 'newcol'
UPDATE TestTab SET newcol = 'newcol'  --6 sec
ALTER TABLE TestTab ADD newcol1 nvarchar(10) DEFAULT 'newcol1' NOT NULL

DROP TABLE TestTab

जब मैं इस परीक्षण स्क्रिप्ट को निष्पादित, ALTERके साथ UPDATE6 सेकंड जो समझा जा सकता है लेता है।

हालाँकि, निष्पादन के ALTERसाथ DEFAULT NOT NULLतुरंत एक बहुत बड़ी मेज पर भी। क्या इस पर कोई स्पष्टीकरण है कि यह तात्कालिक क्यों है? भौतिक डिस्क पर, डेटा को अभी भी सभी पंक्तियों में सही लिखा जाना चाहिए?

मैं SET STATISTICS IO ONऔर क्वेरी योजना को देखने की कोशिश की , हालांकि उन डीडीएल संचालन के लिए उपलब्ध होने लगते हैं।

जवाबों:


23

हां, NOT NULL और एक डिफ़ॉल्ट के साथ एक कॉलम जोड़ना वास्तव में परिवर्तन के समय सभी पंक्तियों को मान नहीं लिखता है, इसलिए यह अब डेटा-ऑफ़-ऑपरेशन नहीं है। जब आप तालिका से चयन करते हैं, तो स्तंभ वास्तव में sys.system_internals_partition_columns से उत्प्रेरित होते हैं , जो सभी मानों को लिखे जाने (जब तक उन्हें बदला नहीं जाता) से रोकता है। ध्यान दें कि यह सभी डेटा प्रकारों के लिए काम नहीं करता है और एंटरप्राइज़ संस्करण की आवश्यकता है।

रेमस रुसानु इसे और अधिक विस्तार से यहाँ बताते हैं:

इसके अलावा, ALTERकम से कम, हम अभी भी आपको एक योजना नहीं दिखा सकते क्योंकि SQL सर्वर एक उत्पादन नहीं करता है, लेकिन I / O को देखने के लिए, आप SQL संतरी योजना एक्सप्लोरर का उपयोग कर सकते हैं । * यह स्क्रीन शॉट एक कॉलम, c5 जोड़कर दिखाता है। , "ऑनलाइन" जैसा कि ऊपर वर्णित है, और फिर एक और कॉलम, सी 6, "ऑफ़लाइन" क्योंकि एलओबी प्रकार समर्थित नहीं हैं। आप देख सकते हैं कि I / O ज्यादातर लिखने के बजाय रीड के रूप में व्यक्त किया जाता है, लेकिन UPDATEऑफ़लाइन परिवर्तन के साथ जुड़ा हुआ अधिक अमान्य (अमान्य) है ।

I / O ऑनलाइन बनाम ऑफ़लाइन परिवर्तन के लिए

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

ध्यान दें कि SQL सर्वर एक अनुमानित योजना का उत्पादन करेगा , लेकिन यह बहुत उपयोगी नहीं है। बिल्कुल भी। और एक ऑनलाइन परिवर्तन के लिए अनुमानित योजना ऑफ़लाइन परिवर्तन के लिए अनुमानित योजना के समान है।

ऑनलाइन परिवर्तन के लिए योजना आरेख

* अस्वीकरण: मैं एसक्यूएल संतरी के लिए काम करता हूं।


4
+1: esp। "एंटरप्राइज एडिशन" के लिए। मैंने हमेशा सोचा है कि यह मेरे कुछ ग्राहक साइटों पर काम क्यों नहीं किया ...
RBarryYoung
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.