पहली चीजें पहले: तालिका में कितना डेटा है? पंक्तियों की संख्या और तालिका का आकार?
दूसरा: क्या आप इस तालिका को एक परीक्षण सर्वर पर वापस ला सकते हैं और प्रभाव को देखने के लिए परिवर्तन कथन को चला सकते हैं (मान लें कि तालिका गैर-उत्पादन प्रणाली में फिट होने के कारण बहुत बड़ी नहीं है)? मुझे हमेशा लगता है कि मेरे वातावरण में परीक्षण इंटरव्यू की सलाह से अधिक सटीक है क्योंकि ऐसे कई कारक हैं जो परिणाम को प्रभावित कर सकते हैं जो कि प्रश्न में प्रदान नहीं किया जा सकता है बस यह नहीं जानने के कारण कि वे कारक परिणाम को प्रभावित कर सकते हैं।
तीसरा: एक चर-लंबाई क्षेत्र का आकार बढ़ाना (यह मानते हुए कि आप 8060 बाइट सीमा से अधिक नहीं हैं) एक साधारण मेटा-डेटा ऑपरेशन है क्योंकि इस तरह के ऑपरेशन के लिए कोई वास्तविक डेटा नहीं बदल रहा होगा। लेकिन, दूसरी ओर, चर-लंबाई क्षेत्र के आकार को कम करना, यहां तक कि स्पष्ट रूप से काम करने के लिए अधिक से अधिक, यह एक साधारण मेटा-डेटा परिवर्तन नहीं है, क्योंकि SQL सर्वर को पता नहीं है, सभी पंक्तियों को स्कैन करने से पहले , कि नया अनुरोध किया गया आकार मान्य है।
इसलिए: हाँ, यह समय की अवधि के लिए तालिका को लॉक कर देगा । कितना समय है? खैर, यहाँ परीक्षण है कि मैंने अभी किया था:
मेरे पास कुछ अन्य परीक्षण से, एक एकल INT NOT NULL
फ़ील्ड और 1 मिलियन पंक्तियों वाली एक तालिका थी । मैंने इसे इस परीक्षण के माध्यम से एक नई तालिका में कॉपी किया:
SELECT *, CONVERT(NVARCHAR(MAX), NEWID()) AS [StringField]
INTO dbo.ResizeTest
FROM dbo.ClusteredUnique;
इस तरह से मैं एक ऐसे MAX
क्षेत्र के परिदृश्य के साथ शुरू कर रहा था (मुझे सिर्फ एहसास हुआ कि आपके पास है VARCHAR
और मैं उपयोग कर रहा हूं NVARCHAR
, लेकिन यह उस व्यवहार को नहीं बदलना चाहिए जो मैं देख रहा हूं) जिसे मैं तब बदल सकता था 500
। और इसमें ऐसा डेटा है जो 500 अक्षरों के भीतर आसानी से फिट हो सकता है। जिसमें कुछ मिनट लगे।
मैं फिर भागा:
ALTER TABLE dbo.ResizeTest ALTER COLUMN [StringField] NVARCHAR(500) NULL;
और यह सिर्फ 11 मिनट से अधिक समय लगा।
मैंने बस फिर से परीक्षण किया, इस बार [ResizeTest]
तालिका को गिरा दिया और दोनों NVARCHAR
को बदलकर बस VARCHAR
, केवल सुपर-सुनिश्चित होने के लिए कि मैं सेब की तुलना किसी ऐसी चीज से कर रहा हूं जो कम से कम एक सेब की तरह दिखती है ;-)।
प्रारंभिक तालिका निर्माण में 20 ALTER TABLE
मिनट लगे जबकि 2 मिनट लगे।
इसलिए, डाउनटाइम का आकलन करने के संदर्भ में, यह वास्तव में करना मुश्किल है क्योंकि यह डिस्क I / O गति पर आधारित है, चाहे डेटा फ़ाइल और / या लेनदेन लॉग आदि पर किसी भी ऑटो-विकास संचालन की आवश्यकता हो या नहीं। शायद इस बात का एक बड़ा हिस्सा है कि मेरे पहले परीक्षण को बदलने में 11 मिनट क्यों लगे और दूसरा, डेटा के VARCHAR
आधे आकार के होने के बावजूद NVARCHAR
, केवल 2 मिनट लगे (यानी उस बिंदु पर फाइलें पूर्व-विकसित थीं)। लेकिन फिर भी, आपको यह ध्यान रखना चाहिए कि मेरा परीक्षण मेरे लैपटॉप पर चल रहा है जो सबसे तेज़ डिस्क नहीं है, लेकिन यह 2 छोटे कॉलमों की सिर्फ 1 मिलियन पंक्तियाँ (22 या इतनी बाइट्स प्रति पंक्ति) थी।
और जब से आपने पूछा कि यह डेटा पृष्ठों पर क्या करेगा, तो यहां आपका जवाब है। मैंने sp_spaceused
टेबल बनाने के बाद, करने के बाद ALTER COLUMN
, और करने के बाद किया ALTER TABLE dbo.ResizeTest REBUILD;
। परिणाम (निम्नलिखित संख्याएँ दूसरे परीक्षण के उपयोग पर आधारित हैं VARCHAR
, न कि पहली परीक्षा का उपयोग करके NVARCHAR
):
After initial table creation: 526,344 KB
After ALTER COLUMN VARCHAR(500): 1,031,688 KB <--- !! Yikes!!
After ALTER REBUILD: 526,472 KB
यदि आप ऑपरेशन को कम से कम समय तक रखने की आवश्यकता के बारे में चिंतित हैं, तो एक लेख देखें जो मैंने बस ऐसा करने के बारे में लिखा था: सिक्योरिटीज में 100 मिलियन रो (या अधिक) टेबल। Srsly! (मुफ्त पंजीकरण आवश्यक)।
ALTER
उत्तराधिकार में प्रत्येक स्तंभ को संपादित करता हूं - प्रत्येक क्रिया में एक सेकंड से भी कम समय लगता है। जब तक वे किए गए, तब तक तालिका आकार में दोगुनी हो गई थी, लेकिन एक बार जब मैंने एकREBUILD
(जो एक उप-द्वितीय ऑपरेशन भी था) किया, तो तालिका अपने मूल आकार में वापस चली गई।