কোনও ভার্চার কলামের আকার হ্রাস করার ফলে ডাটাবেস ফাইলে কী প্রভাব ফেলবে?


15

আমাদের ডাটাবেসে বেশ কয়েকটি টেবিল রয়েছে যার VARCHAR(MAX)কলাম রয়েছে যেখানে একটি VARCHAR(500)(বা সর্বোচ্চের চেয়ে অনেক ছোট কিছু) যথেষ্ট হবে। স্বাভাবিকভাবেই আমি এগুলি পরিষ্কার করতে চাই এবং মাপগুলি আরও যুক্তিসঙ্গত স্তরে নামিয়ে আনতে চাই। এটি 'কীভাবে' করব তা আমি বুঝতে পেরেছি: আমার প্রশ্নটি হ'ল এই কলামগুলি পৃষ্ঠাগুলিতে কীভাবে পরিবর্তন করবে এবং ডিস্কে থাকা লোকেদের কী করবে? (আপনি যখন কলামটি বড় করবেন তখন কী ঘটে যায় সে সম্পর্কে অনেক তথ্য রয়েছে তবে যখন আপনি একটি সঙ্কুচিত করবেন তখন কী হবে তার তথ্য সন্ধান করতে সমস্যা হচ্ছে))

কয়েকটি টেবিলের খুব ছোট সারি গণনা রয়েছে, সুতরাং আমি পরিবর্তনের ব্যয় সম্পর্কে চিন্তিত নই, তবে কয়েকটি বেশ বড়, এবং আমি তাদের সম্পর্কে সম্ভাব্য পুনর্গঠিত হওয়ার কারণে এবং প্রচুর অবরুদ্ধ / ডাউনটাইম সৃষ্টি করার বিষয়ে উদ্বিগ্ন। ব্যবহারিক দিক থেকে, আমি কেবল একটি রক্ষণাবেক্ষণ উইন্ডোটি অনুমান করার একটি উপায় চাই। সাধারণভাবে, আমি কীভাবে ডাটাবেস ইঞ্জিনটি এই ক্ষেত্রে আচরণ করে তা আরও ভালভাবে বুঝতে চাই।

আগাম ধন্যবাদ!

সম্পাদনা করুন:

আমার কাছে 20 টি টেবিল রয়েছে যা আমি দেখছি, যদিও এর মধ্যে কেবল অর্ধেকের মধ্যে 1000 টিরও বেশি সারি গণনা রয়েছে। বৃহত্তমটিতে প্রায় এক মিলিয়ন সারি রয়েছে। সবচেয়ে খারাপ অপরাধী একটি টেবিল যা 350,000 সারি এবং চারটি VARCHAR(MAX)কলাম রয়েছে যা VARCHAR(500)স্তরে সঙ্কুচিত হতে পারে ।

উত্তর:


12

প্রথম জিনিসগুলি: টেবিলটিতে কতটা ডেটা রয়েছে? সারি সংখ্যা এবং টেবিলের আকার?

দ্বিতীয়: আপনি কি এই টেবিলটিকে একটি পরীক্ষার সার্ভারে ব্যাক আপ এবং পুনঃস্থাপন করতে পারেন এবং প্রভাবটি দেখতে (পরিবর্তন অনুগ্রহ করে না যে টেবিলটি একটি অ-উত্পাদনের সিস্টেমে ফিট করার পক্ষে খুব বড় হওয়ার কারণে এটি অযোগ্য নয়)? আমি সর্বদা খুঁজে পাই যে আমার পরিবেশে পরীক্ষা করা ইন্টারভিউগুলির পরামর্শের চেয়ে আরও সঠিক কারণ যে কারণগুলিতে ফলাফলকে প্রভাবিত করতে পারে এমন বেশ কয়েকটি কারণ রয়েছে যা এই কারণগুলি ফলাফলকে প্রভাবিত করতে পারে তা না জেনে কারণেই প্রশ্নটিতে সরবরাহ করা যায় না।

তৃতীয়: বৃদ্ধি একটি পরিবর্তনশীল দৈর্ঘ্যের মাঠের আকার হয় (অভিমানী আপনি 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! (বিনামূল্যে নিবন্ধকরণ প্রয়োজন)।


2
সুতরাং আমি আমার স্থানীয় উদাহরণে সবচেয়ে খারাপ টেবিলটি অনুলিপি করেছি (যেমন, ধীর ডিস্ক এবং 1/3 কোর)। আমি ALTERধারাবাহিকভাবে প্রতিটি কলাম সম্পাদনা করেছি - প্রতিটি ক্রিয়া এক সেকেন্ডেরও কম সময় নিয়েছিল। এটি সম্পন্ন হওয়ার পরে, টেবিলটি আকারে দ্বিগুণ হয়ে গেছে, তবে একবার আমি এটি REBUILD(যা একটি সাব-সেকেন্ড অপারেশনও হয়েছিল) হয়ে গেলে, টেবিলটি তার মূল আকারে ফিরে যায়।
নাতিরভিন

@নাতেয়ারভিন এটি শুনে ভাল লাগছে। আপনি ALTER TABLEপ্রতিটি কলামকে কমা দিয়ে পৃথক করে একটি শট করে সমস্ত ক্ষেত্রটি সম্পাদন করে গতি সম্পন্ন করতে পারেন । যদি লেনদেনটি খুব বড় হয় তবে টেবিলকে দুটি কলামের অর্ধেকের দুটি বিবৃতিতে বিভক্ত করুন। এবং টেবিলটি কত বড় হয়ে যায় তার উপর নির্ভর করে আপনি এমনকি দুটি আলেটার স্টেটমেন্টের প্রত্যেকটির মধ্যে একটি বিদ্রোহ করতে পারেন। কিছু খেলতে হবে। এছাড়াও, মনে রাখবেন যে অপারেশন সম্ভবত সময়কালের জন্য স্কিমা-লক নেবে যা টেবিলের সমস্ত অ্যাক্সেসকে ব্লক করে দেবে।
সলোমন রুটজকি

1
আমি প্রতিটি ALTERপৃথক করেছিলাম যাতে আমি প্রত্যেকের মধ্যে আকারের পরিবর্তনগুলি ট্র্যাক করতে পারি তবে তা অবশ্যই জানা উচিত। ধন্যবাদ!
নাতির্ভিন

1

আমি পরিবর্তনের বিবৃতিটি যা চালিয়েছি তা থেকে টেবিলে যতক্ষণ না অন্য প্রক্রিয়াটি লক করা থাকে ততক্ষণ বেশি সময় নেওয়া উচিত নয়। জিবিএন এর মতে এটি কেবলমাত্র একটি মেটাডেটা পরিবর্তন: /programming/ -size

এছাড়াও, এটি কীভাবে সংরক্ষণ করা যায়, মনে হয় যে এসকিউএল সার্ভার একটি 8k পৃষ্ঠায় ভার্চর ডেটা সংরক্ষণ করেছে যতক্ষণ না এটি একটি সম্পূর্ণ পৃষ্ঠা পূরণ করে, যা এই সময়ে এটি একটি পয়েন্টারের সাথে প্রতিস্থাপন করে এবং এটি একটি বিএলওবি হিসাবে সংরক্ষণ করে।

আমি ধরে নিচ্ছি যে আপনি যখন দৈর্ঘ্য পরিবর্তন করবেন, আপনি কোনও রেকর্ড ছাঁটাইবেন না। যদি তা হয়, তবে আপনি যে পরিমাণ ডেটা ভারচর (500) এ রূপান্তর করছেন সর্বাধিকতম, সর্বোচ্চ 502 বাইট দীর্ঘ হওয়া উচিত এবং কোনও পয়েন্টার নাও থাকা উচিত।

সুতরাং, দীর্ঘ গল্প সংক্ষিপ্ত, যতক্ষণ না আপনি কোনও ডেটা কাটাচ্ছেন না ততক্ষণ পরিবর্তন হওয়া উচিত নয়।


5
এটি একেবারে ভুল। আমি হ্রাস করব না কারণ আপনি আসলে এটি পরীক্ষা করেছেন (যা কিছু লোকের চেয়ে বেশি, তাই এটি করার জন্য ধন্যবাদ) তবে আপনার এটি স্কেল করে পরীক্ষা করা দরকার। আপনি যে উত্তরটির সাথে যুক্ত হয়েছেন সেটি হ'ল আকার বাড়ানো সম্পর্কে, কমছে না। এগুলি দুটি খুব আলাদা অপারেশন।
সলোমন রুটজকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.