Fragmentation چیست؟
چرا Fragmentation هنوز هم یکی از دغدغههای اصلی DBAها است؟
بسیاری تصور میکنند با استفاده از حافظههای SSD و سرورهای قدرتمند، مشکل Fragmentation دیگر اهمیت گذشته را ندارد. این تصور تنها بخشی از واقعیت را بیان میکند. اگرچه سختافزارهای جدید هزینه دسترسی تصادفی به دیسک را کاهش دادهاند، اما Fragmentation همچنان میتواند باعث افزایش تعداد Page Read، کاهش بهرهوری Buffer Pool، افزایش مصرف I/O و طولانیتر شدن زمان اجرای Queryها شود.
در محیطهای عملیاتی که حجم بالایی از تراکنشها، عملیات Insert، Update و Delete انجام میشود، ساختار ایندکسها به مرور از حالت ایدهآل خارج میشود. در چنین شرایطی SQL Server برای بازیابی دادهها مجبور به پیمایش صفحات بیشتری خواهد بود و همین موضوع میتواند باعث افزایش زمان پاسخگویی سیستم شود.
از سوی دیگر باید توجه داشت که همه انواع Fragmentation الزاماً نیاز به اصلاح ندارند. تصمیم برای Rebuild یا Reorganize باید بر اساس حجم ایندکس، الگوی دسترسی به دادهها، میزان Page Density، نوع Storage و شاخصهای واقعی عملکرد سیستم اتخاذ شود، نه صرفاً بر اساس درصد Fragmentation.
به همین دلیل، مدیران پایگاه داده حرفهای تنها به مشاهده مقدار avg_fragmentation_in_percent اکتفا نمیکنند و مجموعهای از شاخصهای عملکردی را همزمان بررسی میکنند تا مطمئن شوند عملیات نگهداری ایندکس واقعاً ارزش صرف منابع را دارد.
Fragmentation در SQL Server به 2 نوع اصلی تقسیم میشود:
1- Internal Fragmentation (تکهتکه شدن داخلی)
-
علت:
-
درج یا حذف رکوردها که باعث ایجاد فضای خالی در صفحات میشود.
-
بهروزرسانیهایی که اندازه رکوردها را تغییر میدهند (مثلاً افزایش طول یک ستون VARCHAR).
-
-
تأثیر:
-
فضای ذخیرهسازی بیشتری مصرف میشود.
-
تعداد صفحات بیشتری برای ذخیره دادهها نیاز است، که باعث افزایش I/O (ورودی/خروجی) میشود.
-
2- External Fragmentation (تکهتکه شدن خارجی)
-
علت:
-
عملیاتهای درج، حذف یا بهروزرسانی که باعث تغییر در ساختار ایندکس یا جدول میشوند.
-
تخصیص غیرپیوسته صفحات جدید به جدول یا ایندکس.
-
-
تأثیر:
-
SQL Server برای خواندن دادهها نیاز به پرش بین صفحات غیرمرتبط در دیسک دارد، که باعث افزایش زمان اجرای کوئریها میشود.
-
چگونه در ساختار B-Tree ایجاد میشود؟
برای درک صحیح Fragmentation ابتدا باید بدانیم که بیشتر ایندکسهای Rowstore در SQL Server بر پایه ساختار B-Tree ساخته میشوند. این ساختار شامل Root Page، صفحات میانی و Leaf Page است که به صورت منطقی به یکدیگر متصل هستند.
در حالت ایدهآل، صفحات Leaf به ترتیبی قرار میگیرند که SQL Server بتواند هنگام اجرای Index Scan آنها را با حداقل جابهجایی بخواند. اما با افزایش عملیات درج، حذف و بهروزرسانی، صفحات جدید در محلهای مختلف فایل داده تخصیص داده میشوند. در نتیجه ترتیب فیزیکی صفحات با ترتیب منطقی آنها متفاوت میشود و External Fragmentation شکل میگیرد.
از طرف دیگر اگر رکوردها حذف شوند یا اندازه آنها تغییر کند، فضای خالی داخل صفحات افزایش مییابد که به Internal Fragmentation منجر میشود. بنابراین هر دو نوع Fragmentation در نهایت از تغییرات طبیعی دادهها در طول زمان ناشی میشوند، اما اثر آنها بر عملکرد سیستم متفاوت است.
دلایل ایجاد Fragmentation
-
عملیات DML (Data Manipulation Language):
-
Insert: افزودن رکوردهای جدید میتواند باعث تخصیص صفحات جدید شود، بهخصوص اگر ایندکسها به ترتیب خاصی مرتب نباشند.
-
Update: تغییر اندازه رکوردها (مثلاً افزایش طول داده در یک ستون) میتواند باعث جابهجایی دادهها و ایجاد فضای خالی شود.
-
Delete: حذف رکوردها فضای خالی در صفحات ایجاد میکند.
-
-
عدم نگهداری منظم ایندکسها: اگر ایندکسها به طور دورهای بازسازی (Rebuild) یا سازماندهی (Reorganize) نشوند، تکهتکه شدن افزایش مییابد.
-
رشد سریع جدول: جداولی که به سرعت رشد میکنند (مثلاً در برنامههای پرتراکنش) بیشتر در معرض Fragmentation هستند.
-
Fill Factor نامناسب: تنظیم نادرست Fill Factor (درصد پر شدن صفحات ایندکس) میتواند باعث Internal Fragmentation شود. برای مثال Fill Factor پایین باعث فضای خالی زیاد و Fill Factor بالا باعث Page Splits (تقسیم صفحات) میشود.
-
Page Splits: وقتی یک صفحه پر میشود و رکورد جدیدی باید به آن اضافه شود، SQL Server صفحه را به دو صفحه تقسیم میکند، که این باعث پراکندگی دادهها و External Fragmentation میشود.
قش Page Split در افزایش Fragmentation
یکی از مهمترین عواملی که باعث افزایش Fragmentation میشود، رخداد Page Split است.
هر Page در SQL Server دارای ظرفیت ثابتی برابر با ۸ کیلوبایت است. زمانی که صفحه کاملاً پر شده باشد و رکورد جدیدی باید در همان موقعیت منطقی درج شود، SQL Server مجبور است صفحه را به دو بخش تقسیم کند. بخشی از رکوردها به صفحه جدید منتقل میشوند و سپس لینکهای ساختار B-Tree نیز بهروزرسانی میشوند.
این فرآیند اگرچه برای حفظ ترتیب منطقی ایندکس ضروری است، اما هزینه قابل توجهی دارد. Page Split علاوه بر ایجاد عملیات نوشتن بیشتر روی دیسک، باعث افزایش Log Generation، افزایش مصرف CPU، کاهش Page Density و در نهایت افزایش Fragmentation خواهد شد.
به همین دلیل در جداولی که به طور مداوم دادههای جدید در میان کلیدهای موجود درج میشوند، انتخاب صحیح کلید خوشهای و تنظیم مناسب Fill Factor اهمیت بسیار زیادی دارد.
تأثیرات Fragmentation
-
کاهش سرعت کوئریها: به دلیل نیاز به خواندن صفحات پراکنده یا تعداد بیشتری از صفحات.
-
افزایش I/O: پراکندگی دادهها باعث افزایش عملیات ورودی/خروجی دیسک میشود.
-
مصرف بیشتر منابع: CPU و حافظه بیشتری برای پردازش کوئریها نیاز است.
-
افزایش فضای ذخیرهسازی: Internal Fragmentation باعث هدر رفتن فضای دیسک میشود.
-
تأخیر در عملیاتهای تراکنشی: در سیستمهای پرتراکنش، Fragmentation میتواند تأخیر قابل توجهی ایجاد کند.
شناسایی Fragmentation
SELECT
OBJECT_NAME(object_id) AS TableName,
index_id,
index_type_desc,
avg_fragmentation_in_percent,
avg_page_space_used_in_percent,
page_count
FROM sys.dm_db_index_physical_stats(DB_ID('YourDatabaseName'), NULL, NULL, NULL, 'DETAILED')
WHERE index_id > 0 -- فقط ایندکسها (0 برای Heap است)
AND page_count > 100 -- فقط ایندکسهایی با تعداد صفحات قابل توجه
ORDER BY avg_fragmentation_in_percent DESC;
-
avg_fragmentation_in_percent: درصد تکهتکه شدن خارجی (External Fragmentation). مقادیر بالاتر نشاندهنده پراکندگی بیشتر است.
-
avg_page_space_used_in_percent: درصد پر شدن صفحات (مربوط به Internal Fragmentation). مقادیر پایینتر نشاندهنده فضای خالی بیشتر است.
-
page_count: تعداد صفحات در ایندکس یا جدول.
-
avg_fragmentation_in_percent:
-
0-10%: تکهتکه شدن کم (نیازی به اقدام نیست).
-
10-30%: تکهتکه شدن متوسط (Reorganize پیشنهاد میشود).
-
30%: تکهتکه شدن بالا (Rebuild پیشنهاد میشود).
-
-
avg_page_space_used_in_percent:
-
75%: پر شدن مناسب صفحات.
-
<75%: فضای خالی زیاد (Internal Fragmentation).
-
رفع Fragmentation
Reorganize Index
-
توضیح: این عملیات ایندکس را به صورت آنلاین (Online) سازماندهی میکند و صفحات را مرتب میکند بدون اینکه ایندکس را از نو بسازد. این روش برای رفع External Fragmentation و بهبود ترتیب صفحات مناسب است.
-
مزایا:
-
عملیات سبکتر و کمهزینهتر از Rebuild.
-
به صورت آنلاین انجام میشود و تأثیر کمتری روی دسترسی به جدول دارد.
-
-
معایب:
-
Internal Fragmentation را به طور کامل برطرف نمیکند.
-
برای Fragmentation شدید کافی نیست.
-
-
دستور:
ALTER INDEX IndexName ON TableName REORGANIZE;
-
زمان استفاده: وقتی avg_fragmentation_in_percent بین 10-30% است.
Rebuild Index
-
مزایا:
-
تمام انواع تکه تکه شدن را برطرف میکند.
-
Fill Factor را بهینه میکند.
-
-
معایب:
-
منابع بیشتری (CPU، I/O) مصرف میکند.
-
در حالت آفلاین (در نسخههای استاندارد) میتواند باعث قفل شدن جدول شود. در نسخههای Enterprise، میتوان از گزینه ONLINE استفاده کرد.
-
- دستور:
ALTER INDEX IndexName ON TableName REBUILD WITH (ONLINE = ON, FILLFACTOR = 80);
-
زمان استفاده: وقتی avg_fragmentation_in_percent بیش از 30% است یا Internal Fragmentation شدید است.
تنظیم Fill Factor
-
Fill Factor تعیین میکند که صفحات ایندکس تا چه درصدی پر شوند. تنظیم مناسب Fill Factor میتواند از Fragmentation در آینده جلوگیری کند.
-
مقادیر پیشنهادی:
-
برای جداول با تغییرات کم: Fill Factor بین 90-100%.
-
برای جداول با تغییرات زیاد (تراکنشهای مکرر): Fill Factor بین 70-80%.
-
-
دستور:
ALTER INDEX IndexName ON TableName REBUILD WITH (FILLFACTOR = 80);
آیا Fill Factor پایین همیشه انتخاب مناسبی است؟
یکی از رایجترین اشتباهات DBAها این است که تصور میکنند کاهش Fill Factor همیشه باعث کاهش Fragmentation خواهد شد.
واقعیت این است که Fill Factor تنها فضای خالی بیشتری در صفحات ایجاد میکند تا احتمال وقوع Page Split کاهش یابد. اگر جدول به ندرت تغییر کند، این فضای خالی عملاً بلااستفاده خواهد ماند و تنها باعث افزایش حجم ایندکس و مصرف بیشتر Buffer Pool میشود.
از سوی دیگر، اگر جدول دارای نرخ بالای Insert یا Update باشد، کاهش منطقی Fill Factor میتواند تعداد Page Splitها را کاهش دهد و عملکرد کلی سیستم را بهبود بخشد.
بنابراین هیچ مقدار ثابتی برای Fill Factor وجود ندارد و مقدار مناسب باید بر اساس الگوی واقعی تغییرات دادهها، نوع بار کاری و نتایج مانیتورینگ انتخاب شود.
نگهداری خودکار
نکات مهم و بهترین روشها
-
بررسی منظم: Fragmentation را به صورت دورهای (مثلاً هفتگی یا ماهانه) بررسی کنید، بهخصوص برای جداول پرتراکنش.
-
انتخاب روش مناسب: از Reorganize برای Fragmentation متوسط و از Rebuild برای Fragmentation شدید استفاده کنید.
-
استفاده از ONLINE Option: در محیطهای عملیاتی با دسترسی بالا، از گزینه ONLINE = ON در Rebuild استفاده کنید تا تأثیر روی کاربران کاهش یابد.
-
توجه به Heap Tables: جداول بدون Clustered Index (Heap) نیز میتوانند دچار Fragmentation شوند. برای رفع آن، میتوانید Clustered Index اضافه کنید یا جدول را بازسازی کنید.
-
مانیتورینگ عملکرد: بعد از رفع Fragmentation، عملکرد کوئریها را با ابزارهایی مثل SQL Server Profiler یا Extended Events بررسی کنید.
-
جلوگیری از Page Splits :Fill Factor را بهینه تنظیم کنید و از ستونهای با طول متغیر (مثل VARCHAR) با دقت استفاده کنید.
تفاوت Fragmentation در Heap و Clustered Index
-
Heap Tables: جداولی که Clustered Index ندارند، بیشتر در معرض Internal Fragmentation هستند، زیرا دادهها به صورت غیرمرتب ذخیره میشوند. برای رفع Fragmentation در Heap، میتوانید جدول را بازسازی کنید یا Clustered Index اضافه کنید.
-
Clustered Index: این ایندکسها ترتیب منطقی دادهها را تعیین میکنند و بیشتر در معرض External Fragmentation هستند، بهخصوص اگر درجها و حذفها مکرر باشند.
ابزارهای کمکی
-
SQL Server Management Studio (SSMS): گزارشهای استاندارد برای بررسی تکه تکه شدن ارائه میدهد.
-
Maintenance Plans: برای خودکارسازی Reorganize و Rebuild.
-
اسکریپتهای T-SQL: برای بررسی و رفع تکه تکه شدن به صورت سفارشی.
-
سوم-شخص ابزارها: ابزارهایی مثل Redgate SQL Monitor یا SolarWinds Database Performance Analyzer برای مانیتورینگ پیشرفته.
نتیجه گیری
سؤالات متداول FAQ
آیا Fragmentation همیشه باعث کاهش عملکرد SQL Server میشود؟
خیر. میزان تأثیر Fragmentation به عواملی مانند نوع Queryها، حجم ایندکس، نوع Storage، تعداد Pageها و الگوی دسترسی به دادهها بستگی دارد. در بسیاری از موارد، ایندکسهایی با درصد Fragmentation بالا تأثیر محسوسی بر عملکرد ندارند، در حالی که برخی ایندکسهای کوچک با Fragmentation کمتر نیز میتوانند مشکلساز باشند.
تفاوت Internal Fragmentation و External Fragmentation چیست؟
Internal Fragmentation به فضای خالی موجود داخل صفحات داده یا ایندکس اشاره دارد، در حالی که External Fragmentation به نامنظم بودن ترتیب فیزیکی صفحات نسبت به ترتیب منطقی آنها مربوط میشود. هر دو نوع Fragmentation میتوانند باعث افزایش مصرف منابع شوند، اما نحوه تأثیر آنها بر عملکرد متفاوت است.
چه زمانی باید از Reorganize و چه زمانی از Rebuild استفاده کرد؟
بهطور کلی، برای Fragmentation متوسط معمولاً عملیات Reorganize مناسب است و برای Fragmentation شدید از Rebuild استفاده میشود. با این حال، تصمیم نهایی باید با در نظر گرفتن عواملی مانند تعداد صفحات، نوع Workload، زمان در دسترس برای نگهداری، میزان Log تولیدشده و منابع سختافزاری اتخاذ شود.
آیا حافظههای SSD مشکل Fragmentation را از بین میبرند؟
خیر. SSDها هزینه دسترسی تصادفی به دادهها را کاهش میدهند، اما Fragmentation همچنان میتواند باعث افزایش تعداد Page Read، مصرف بیشتر Buffer Pool و افزایش عملیات I/O شود. بنابراین استفاده از SSD جایگزین نگهداری صحیح ایندکسها نیست.
بهترین روش برای بررسی Fragmentation در SQL Server چیست؟
استفاده از DMVهایی مانند sys.dm_db_index_physical_stats یکی از دقیقترین روشها برای بررسی وضعیت Fragmentation است. همچنین تحلیل شاخصهایی مانند page_count، avg_page_space_used_in_percent و بررسی Execution Plan و Wait Statistics دید کاملتری نسبت به وضعیت واقعی عملکرد پایگاه داده ارائه میدهد.
آیا اجرای روزانه Index Rebuild توصیه میشود؟
خیر. اجرای روزانه Rebuild برای همه ایندکسها معمولاً باعث افزایش مصرف CPU، حافظه، فضای Log و منابع ذخیرهسازی میشود و حتی ممکن است تأثیر منفی بر عملکرد سیستم داشته باشد. عملیات نگهداری ایندکسها باید بر اساس وضعیت واقعی پایگاه داده و نتایج مانیتورینگ برنامهریزی شود.
Fill Factor چه نقشی در کاهش Fragmentation دارد؟
Fill Factor تعیین میکند صفحات ایندکس هنگام ایجاد یا بازسازی تا چه میزان پر شوند. انتخاب مقدار مناسب میتواند احتمال وقوع Page Split را کاهش دهد، اما مقدار نامناسب آن باعث افزایش حجم ایندکس و مصرف بیشتر حافظه خواهد شد. مقدار بهینه Fill Factor برای هر جدول با توجه به نوع Workload و الگوی تغییرات داده متفاوت است.
آیا جداول Heap نیز دچار Fragmentation میشوند؟
بله. اگرچه Heapها ساختار B-Tree ندارند، اما در اثر عملیات Insert، Update و Delete میتوانند دچار Fragmentation شوند. در برخی سناریوها ایجاد یک Clustered Index مناسب یا بازسازی جدول میتواند عملکرد آنها را بهبود دهد.
عملکرد SQL Server شما با وجود نگهداری منظم ایندکسها همچنان مطلوب نیست؟
در بسیاری از سازمانها، اجرای دورهای عملیات Index Rebuild یا Index Reorganize به یک فعالیت روتین تبدیل شده است، اما این اقدامات همیشه به معنای بهبود عملکرد پایگاه داده نیستند. گاهی ریشه اصلی کاهش Performance در عواملی مانند طراحی نامناسب ایندکسها، Queryهای غیربهینه، Statistics قدیمی، Page Splitهای مکرر یا تنظیمات نادرست SQL Server قرار دارد.
تیم توسعه فناوری اطلاعات لاندا با ارائه خدمات تخصصی مشاوره و بهینهسازی SQL Server، وضعیت ایندکسها، Fragmentation، Execution Plan، Wait Statistics، طراحی Index، Maintenance Plan و سایر شاخصهای عملکردی را بهصورت جامع بررسی میکند تا علت واقعی افت کارایی مشخص شود.
اگر قصد دارید بدون صرف هزینههای غیرضروری برای ارتقای سختافزار، عملکرد و پایداری SQL Server سازمان خود را افزایش دهید،
همین امروز با کارشناسان لاندا تماس ✆ بگیرید و از خدمات تخصصی تحلیل و بهینهسازی پایگاه داده بهرهمند شوید.
بهروزرسانی
- این مقاله در تیر ۱۴۰۵ بر اساس جدیدترین Best Practiceهای SQL Server و تجربیات عملی پروژههای سازمانی بازنگری و تکمیل شده است. در این نسخه، مباحثی مانند نقش Page Split در ایجاد Fragmentation، ساختار B-Tree، تأثیر Fill Factor، تفاوت Internal و External Fragmentation، روشهای استاندارد تحلیل با DMVها، معیارهای صحیح انتخاب بین Index Rebuild و Index Reorganize و نکات مرتبط با Performance در زیرساختهای مدرن به مقاله اضافه شدهاند تا محتوایی جامعتر، کاربردیتر و منطبق با نیاز مدیران پایگاه داده و متخصصان SQL Server ارائه شود.


No comment