কীভাবে এসকিউএল সার্ভারে হিপ ফ্র্যাগমেন্টেশন কম করবেন?


10

আমি সম্প্রতি জানতে পেরেছি যে একটি গাদা টেবিলে 70০% এর বেশি টুকরো টুকরো রয়েছে। তাই আমি একটি করার সিদ্ধান্ত নিয়েছে

ALTER TABLE dbo.myTable REBUILD

যথেষ্ট মজার, এরপরে আমার 20% টুকরো টুকরো ছিল। সেই টেবিলে তখন থেকে কোনও লেখা ছিল না। তাই আমি আরও একবার পুনর্নির্মাণ করার সিদ্ধান্ত নিয়েছি।

দ্বিতীয়বারের পরে টেবিলের টুপি 50% আরও বেশি বিভাজন ! আমি সত্যিই বুঝতে পারি না কীভাবে এটি ঘটতে পারে ...


লজিকাল টুকরো টুকরো করার সময় আপনার অর্থ কী। এটি ডেটা পৃষ্ঠাগুলির ব্যবহারের ক্ষেত্রে বিভাজন। আমি জানি যে কোনও অর্ডার নেই তবে অর্ডারর্ডার্ড ডেটা প্রতি সেগমেন্টে টুকরো টুকরো নয়। এই ক্ষেত্রে বিভাজন মানে ডেটা পৃষ্ঠাগুলির দক্ষ ব্যবহার।
tuxmania

2
আমার ধারণা আমাদের জিজ্ঞাসা করা উচিত, টেবিলটি কত বড়? সারি এবং পৃষ্ঠাগুলিতে।
কোডি কোনিয়ার

উত্তর:


17

ফ্র্যাগমেন্টেশন মানে একটি গাদা

ডিএমভি কে avg_fragmentation_in_percentজিজ্ঞাসাবাদ করে আপনি কলাম থেকে যে হ্যাপে বিভাজন মান পেয়েছেন তা sys.dm_db_index_physical_statsউল্লেখ করে

ইনডেক্সের জন্য যৌক্তিক বিভাজন বা IN_ROW_DATA বরাদ্দ ইউনিটে হিপগুলির জন্য বিস্তৃত বিভাজন

আরও একই বিওএল বলে যে

এটি একটি স্তূপের পাতাগুলিতে বহির্মুখী অর্ডার-এর পরিমাণ শতাংশ। অর্ড-অফ-অর্ডার সীমাটি হ'ল এমন একটি যা হ'ল বর্তমান পৃষ্ঠার সীমাটি পূর্ববর্তী পৃষ্ঠাটি রয়েছে তার পরে শারীরিকভাবে পরবর্তী সীমা নয়।

সুতরাং আপনি দেখতে পাচ্ছেন যে এটি হিপগুলিতে বরাদ্দকৃত পৃষ্ঠাগুলিতে উপস্থিত নিখরচায় জায়গা নয় বরং খণ্ডগুলিকে তৈরি করা পৃষ্ঠাগুলির বিভিন্ন ক্রম

এটি ছোট পরীক্ষা দ্বারা প্রদর্শিত হতে পারে। আসুন আমরা একটি হিপ টেবিল তৈরি করি এবং এর মধ্যে কিছু রেকর্ড সন্নিবেশ করি এবং তারপরে খণ্ডগুলি পরীক্ষা করি।

create table dbo.HeapTest
(
Id INT not NULL Default (1),
Col1   char(5000) Not null Default ('Heaps Are Cool')
)

SET NOCOUNT ON

Insert into dbo.Heaptest default values
go 50

select index_type_desc,avg_fragmentation_in_percent,fragment_count,
avg_page_space_used_in_percent,record_count
from sys.dm_db_index_physical_stats(db_id(),object_id('dbo.HeapTest','U'),0,default,'detailed')

সুতরাং হ্যাপ টেবিলটি এতে 50 টি রেকর্ড সহ তৈরি করা হয়। ডিএমভি sys.dm_db_index_physical পরিসংখ্যান পরে ভগ্নাংশটি দেখতে কেমন

এখানে চিত্র বর্ণনা লিখুন

আপনি avg_fragmentation_in_percentকলামের মান 33% দেখতে পাবেন । এখন আসুন দেখুন কীভাবে পৃষ্ঠাগুলি সাজানো আছে। অননুমোদিত জিজ্ঞাসা ব্যবহার করে এটি করা যেতে পারে %%lockres%%। কোয়েরি হবে

SELECT  %%lockres%%, * FROM dbo.HeapTest;

এবং নীচে আউটপুট মত দেখাচ্ছে। এর কেবলমাত্র প্রাসঙ্গিক অংশ সংযুক্ত করা। আমরা আমাদের dbo.HeapTest টেবিলে 50 টি সারি sinceোকানোর পরে ক্যোয়ারী 50 টি সারি তৈরি করেছে produced

এখানে চিত্র বর্ণনা লিখুন

এটি যা বলে প্রথম পৃষ্ঠায় আইডি রয়েছে 197যা পরের পৃষ্ঠায় আইডি রয়েছে 242পরবর্তী পৃষ্ঠাগুলিতে আমরা পৃষ্ঠা আইডিতে পৌঁছা পর্যন্ত অবিচ্ছিন্ন আইডি থাকে 264কারণ এর পরে আমরা পৃষ্ঠা আইডি পাই 280। পৃষ্ঠার আইডি নম্বরগুলিতে এই ঝাঁপটি আসলে ভগ্নাংশের কারণ।

পাছে rebuিপি পুনর্নির্মাণ করুন এবং খণ্ডগুলি এবং পৃষ্ঠাগুলি কীভাবে সাজানো হয়েছে তা দেখতে আবার কমান্ডটি চালান। আমরা যেমন খণ্ডন পাই

এখানে চিত্র বর্ণনা লিখুন

আপনি খণ্ড খণ্ড দেখতে পারেন এখন 14%

আসুন পৃষ্ঠা নম্বর বরাদ্দ করা যাক

এখানে চিত্র বর্ণনা লিখুন

আমাদের কেবলমাত্র একটি লাফ বাকি রয়েছে সমস্ত পৃষ্ঠাগুলি ক্রমিকভাবে পৃষ্ঠা আইডি বরাদ্দ। যেহেতু মাত্র একটি জাম্প বিভাজন যথেষ্ট হ্রাস পেয়েছে।

আমি আবারও হিপগুলি পুনর্নির্মাণ করেছি এবং এখন যখন আমি টুকরো টুকরো পরীক্ষা করেছি তখন এটি সম্পূর্ণরূপে শেষ হয়ে গেছে। এবং পৃষ্ঠা আইডি বরাদ্দ মত

এখানে চিত্র বর্ণনা লিখুন

খণ্ড খণ্ড বৃদ্ধি কেন

খণ্ড খণ্ডের কারণ কী ঘটতে পারে সে সম্পর্কে আমরা এটিকে সত্যায়ন করতে পারি যে পৃষ্ঠাগুলি যখন গাদাতে বরাদ্দ পেয়েছিল তখন তারা অবিচ্ছিন্ন থাকত না, যেমন আপনি উপরে দেখেছেন যে খণ্ড খণ্ডিত মানটি কী কারণে বৃদ্ধি পেয়েছে পৃষ্ঠাগুলিতে আইডি বরাদ্দকৃত পৃষ্ঠাগুলিতে বরাদ্দ ছিল in

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

ফ্র্যাগমেন্টেশন সম্পর্কে সত্যই চিন্তিত

যদি আপনি সত্যিই এমন দৃশ্যের মুখোমুখি হন যেখানে হিপ টেবিলটি খণ্ডিত হয় এবং কোয়েরিগুলি ধীর করে দেয় তবে এটি পুনর্নির্মাণের চেয়ে টেবিলে একটি ক্লাস্টারড সূচক তৈরি করা ভাল better কারণটি হ'ল যখন আপনি সমস্ত অন্তর্নিহিত নন-ক্লাস্টারযুক্ত সূচকগুলি পুনরায় তৈরি করেন তখন পুনর্নির্মাণের প্রক্রিয়াটি আরও বেশি সময় নেয়, প্রচুর সংস্থান ব্যবহার করে এবং লেনদেন লগটি স্ফীত করে দেয়। একটি উত্পাদন সিস্টেমে এটি সর্বদা এড়াতে চেষ্টা করবে। পল এটি সম্পর্কে তার মিথ কাহিনী covered াকা সম্পর্কে আচ্ছাদন ।

PS: অনুগ্রহ করে প্রোডাকশন সিস্টেমে অননুমোদিত কমান্ড ব্যবহার করবেন না। এটি ছিল কেবল প্রদর্শনের জন্য।


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

আপনি কীভাবে সূচক_প্রকার_ডেস্ক, গড়_ফ্রেগমেন্টেশন_আইন_পারসেন্ট, টুকরা_কাউন্ট, গড়_পৃষ্ঠা_স্পেস_ইজড_ইন_পারসেন্ট, রেকর্ড_কাউন্ট sys.dm_db_index_physical_stats (db_id (), 'db.HeapTest', 'ডিফল্ট থেকে' রিটার্নে ',' ডিফল্ট থেকে 'রিটার্ন) নির্বাচন করবেন? এক টেবিল ? এটি আমার জন্য সমস্ত টেবিলের সমস্ত সূচীতে ফিরে আসে এমনকি আমি যদি আমার টেবিলের নামটি 'অবজেক্ট_আইডি'-তে নির্দিষ্ট করে দিয়ে থাকি
মিকেল

@ মিকাএল আমি ফাংশন ডিবি_আইডি () ব্যবহার করেছি যা বর্তমান ডাটাবেস গ্রহণ করবে এবং আমি বিশেষভাবে বস্তুর নাম দিয়েছি যাতে এটি সর্বদা বর্তমান ডাটাবেসটিতে সন্ধান করবে এবং Heaptestফলাফলটি সন্ধান করবে এবং ফলাফল দেবে। আমি নিশ্চিত আপনি হয়ত কিছু মিস করেছেন কেবলমাত্র নিশ্চিত হয়ে নিন যে ডিবি_আইডি ফাংশনটি অসুস্থতার ক্ষেত্রে উপযুক্ততা স্তরটি 80 টি নয়
শ্যাঙ্কি

@ শ্যাঙ্কি আপনি কেন উত্পাদনে অননুমোদিত ক্যোয়ারী %% লকরেস %% ব্যবহার করার পরামর্শ দিচ্ছেন না? আপনি কি বিস্তারিতভাবে বলতে পারেন?
রাল্ফ

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