بررسی Rebuild و Reorganizing ایندکسها:
بررسی Rebuild و Reorganizing ایندکسها:
دادههای ذخیره شده در جداول پایگاه داده با درج رکوردهای جدید و همچنین بروزرسانی یا حذف رکوردهای موجود در حال تغییر هستند. این منجر به وضعیتی میشود که Data Page ها پر نیستند و یا نظم و ترتیب منطقی و فیزیکی Page ها بهم میخورد و یا هر دو مورد اتفاق میافتد. باید در نظر داشت که Disk based Index ها در معرض Fragmentation هستند. دو شکل از Fragmentation در B-Tree ها رخ میدهد:
- Internal Fragmentation (تکه تکه شدن داخلی)
- External Fragmentation (تکه تکه شدن خارجی)
Internal Fragmentation : تکه تکه شدن داخلی به Pageهایی اشاره دارد که فضای خالی زیادی دارند. این مسئله با تراکم صفحه یا Page Density رابطه مستقیمی دارد. اگر Pageها فضای خالی زیادی داشته باشند، SQL Server برای برگرداندن تمام رکوردهای مورد نیاز برای یک Query نیاز به خواندن Pageهای بیشتری از آنچه لازم است دارد. همچنین وقتی Page Density کم باشد، Pageهای بیشتری برای برای ذخیره همان مقدار داده مورد نیاز است. به بیان ساده این یعنی هم برای خواندن و نوشتن دادهها I/O بیشتری لازم است و هم برای ذخیره سازی دادهها حافظهی بیشتری مورد نیاز است. باید دقت داشت که Page Density در طول زمان به دلیل Page Split کاهش مییابد.
تذکر: برای جلوگیری از کاهش بیمورد تراکم صفحه، مایکروسافت توصیه نمیکند که Fill Factor را روی مقادیری غیر از 100 یا صفر تنظیم کنید، جز در موارد خاص برای ایندکسهایی که تعداد زیادی Page Split را تجربه میکنند.
توضیح: Fill Factor پارامتری است که کنترل میکند که چه مقدار فضای خالی در هر Data Page باقی بماند.
External Fragmentation : تکه تکه شدن خارجی زمانی بوجود میآید که ایندکسها دارای Pageهایی باشند که در آنها ترتیب منطقی درون ایندکس براساس مقادیر کلید شاخص، با ترتیب فیزیکی صفحات ایندکس مطابقت نداشته باشد. به بیان ساده تر تکه تکه شدن خارجی به خارج شدن صفحات ایندکس از نظم فیزیکی اشاره دارد. تکه تکه شدن خارجی میتواند به دلیل Page Split ایجاد شود. این مسئله میتواند به شدت Performance را کاهش بدهد، زیرا دادهها را نمیتوان بطور متوالی از دیسک خواند.
حال که با موضوع Fragmentation داخلی و خارجی و تاثیر آنها بر کاهش Performance آشنا شدیم، این سوال مطرح میشود که چطور میتوانیم این دو پدیده را از بین ببریم؟ ما میتوانیم با Reorganize (سازماندهی مجدد) کردن و یا با Rebuild (بازسازی) کردن ایندکس تکه تکه شدنهای داخلی و خارجی ایندکسها را از بین ببیریم و یا باعث کاهش Fragmentation و افزایش Page Density بشویم.
Reorganize Index:
هنگامیکه یک ایندکس را Reorganize (سازماندهی مجدد) میکنید، SQL Server دادهها را در سطح Leaf Level ایندکس سازماندهی مجدد میکند. سازماندهی مجدد یک ایندکس یک عملیات همیشه آنلاین است. این فرآیند طولانی مدت نیست و قفلهای Object-Level بلند مدت نگهداری نمیشوند، به همین دلیل برای Maintenanceهای روزانه میتواند گزینهی مناسبی باشد.
Rebuild Index:
هنگامیکه یک ایندکس را Rebuild (بازسازی) میکنید باعث Drop شدن و Re-Create شدن (ایجاد مجدد) ایندکس میشود. بسته به نوع ایندکس و نسخهی Database Engine عملیات بازسازی ایندکس را میتوان بصورت آفلاین و یا آنلاین انجام داد. بازسازی ایندکس آفلاین معمولا زمان کمتری نسبت به بازسازی آنلاین نیاز دارد، اما قفلهای سطح آبجکت (Object-Level) را برای طول مدت زمان عملیات بازسازی نگه میدارد و دسترسی Queryها به جداول و Viewها را مسدود میکند. بازسازی ایندکس آنلاین تا پایان عملیات نیازی به قفلهای Object-Level بلند مدت ندارد. هنگامیکه تکه تکه شدن به شدت اتفاق میافتد (معمولا بیشتر در جداول ایندکس شده با دادههای بزرگ) عموما نیاز داریم که کل ایندکسها را در چنین جداولی بازسازی کنیم.
مقایسه Reorganize Index و Rebuild Index:
- سازماندهی مجدد نسبت به بازسازی به منابع کمتری نیاز دارد.
- سازماندهی مجدد همیشه یک عملیات آنلاین است در حالیکه در بازسازی بسته به نوع ایندکس و نسخهی Database Engine عملیات بازسازی ایندکس را میتوان بصورت آفلاین و یا آنلاین انجام داد. در عملیات آنلاین قفلهای Object-Level بلند مدت نگهداری نمیشوند.
- بازسازی جداول سیستمی و statistics را تحت تاثیر قرار میدهد و ایندکسهای غیر فعال را فعال میکند، در حالیکه سازماندهی مجدد یک عملیات پاکسازی خالص (Pure Cleanup Operation) است که تمام وضعیت سیستم را هانطور که هست باقی میگذارد.
- سازماندهی مجدد Defragmentation را فقط در سطح B-Tree Leaf Level انجام میدهد، در حالیکه بازسازی ایندکس کل B-Tree را تغییر میدهد و ایندکس را دوباره ایجاد میکند.
- در بازسازی کمی concurrency را از دست میدهیم، اما سازماندهی مجدد برای concurrency بهتر است.
- سازماندهی مجدد از Extra Work Space کمی برای انجام عملیات Defrag استفاده میکند در حالیکه بازسازی دوباره به اندازهی ایندکس از Extra Work Space استفاده میکند.
Best Practices (بهترین روش) و توصیهها:
براساس اسناد مایکروسافت به دلیل اینکه سازماندهی مجدد یک ایندکس نسبت به بازسازی ایندکس به منابع کمتری نیاز دارد توصیه شده است که روش نگهداری ترجیحی شما باشد، مگر اینکه دلیل خاصی برای استفاده از بازسازی ایندکس وجود داشته باشد.همچنین مایکروسافت پیشنهاد میکند که وقتی ایندکسها بیش از 30%، Fragmentation دارد، Rebuild کنیم و زمانیکه Fragmentation بین 5% تا 30% است، Reorganize نمائیم.همچنین در سند دیگری اشاره شده است که عموما سطوح Fragmentation 10% یا کمتر نباید مشکلی در Performance ایجاد کند، بنابراین نیازی به انجام کاری ندارید و می توانید آنرا نادیده بگیرید. شاید به همین دلیل است که در برخی از اسناد توصیه شده است که Fragmentation بین 10% تا 30% را Reorganize نمائید (نه 5% تا 30%).
در صورتی پایگاه داده شما یک پایگاه داده ایستا (مانند بایگانی) است و شما فقط از روی آن میخوانید، بازسازی ایندکس مهم نیست زیرا دادهها تغییر نمی کنند، اما اگر پایگاه داده شما دارای مقادیر زیادی درج/بروزرسلنی و حذف باشد، بازسازی ممکن است نقش مهمی همراه با بروزرسانی Statistics داشته باشد.
نکته: SQL Server بطور خودکار Statistics را پس از بازسازی ایندکس بروز میکند. این بروز رسانی Statistics معادل بروز رسانی Statistics با Full Scan است و Column Statistics را به روز نمیکند و ما باید Column Statistics را پس از Rebuild ایندکس بروز کنیم.
💬 نظرات (0)
هنوز نظری ثبت نشده است. اولین نفری باشید که نظر میدهید!
📝 ثبت نظر جدید