প্রথম জিনিসগুলি: টেবিলটিতে কতটা ডেটা রয়েছে? সারি সংখ্যা এবং টেবিলের আকার?
দ্বিতীয়: আপনি কি এই টেবিলটিকে একটি পরীক্ষার সার্ভারে ব্যাক আপ এবং পুনঃস্থাপন করতে পারেন এবং প্রভাবটি দেখতে (পরিবর্তন অনুগ্রহ করে না যে টেবিলটি একটি অ-উত্পাদনের সিস্টেমে ফিট করার পক্ষে খুব বড় হওয়ার কারণে এটি অযোগ্য নয়)? আমি সর্বদা খুঁজে পাই যে আমার পরিবেশে পরীক্ষা করা ইন্টারভিউগুলির পরামর্শের চেয়ে আরও সঠিক কারণ যে কারণগুলিতে ফলাফলকে প্রভাবিত করতে পারে এমন বেশ কয়েকটি কারণ রয়েছে যা এই কারণগুলি ফলাফলকে প্রভাবিত করতে পারে তা না জেনে কারণেই প্রশ্নটিতে সরবরাহ করা যায় না।
তৃতীয়: বৃদ্ধি একটি পরিবর্তনশীল দৈর্ঘ্যের মাঠের আকার হয় (অভিমানী আপনি 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
মিনিট সময় নিয়ে 20 মিনিট সময় নেয়।
সুতরাং, ডাউনটাইম অনুমানের ক্ষেত্রে, এটি করা সত্যিই কঠিন কারণ এটি ডিস্ক I / O গতির উপর ভিত্তি করে, কোনও অটো-বর্ধিত ক্রিয়াকলাপ ডেটা ফাইল এবং / অথবা লেনদেন লগ ইত্যাদিতে হওয়া দরকার কিনা That সম্ভবত আমার প্রথম পরীক্ষার পরিবর্তনের জন্য 11 মিনিট সময় নিয়েছিল এবং দ্বিতীয়টি, এমনকি ডেটার VARCHAR
অর্ধেক আকার ধারণ করে NVARCHAR
, মাত্র 2 মিনিট সময় নেয় (অর্থাত্ ফাইলগুলি সেই সময়ে প্রাক-উত্থিত হয়েছিল)। তবে তবুও, আপনার মনে রাখা উচিত যে আমার ল্যাপটপে আমার পরীক্ষা চলছে যা দ্রুততম ডিস্ক নয়, এটি ছিল 2 মিলিয়ন সারি 2 ছোট কলাম (সারি প্রতি 22 বা তাই বাইট)।
এবং যেহেতু আপনি জিজ্ঞাসা করেছেন এটি ডেটা পৃষ্ঠাগুলিতে কী করবে, তাই আপনার উত্তর এখানে is আমি 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
(যা একটি সাব-সেকেন্ড অপারেশনও হয়েছিল) হয়ে গেলে, টেবিলটি তার মূল আকারে ফিরে যায়।