آموزش پیشرفته SQL Server (جلسه پنجم) - Page Split

Page Split، قسمتی از آموزش پیشرفته SQL Server است، پیشنهاد می شود قبل از مطالعه ی Page Split، قسمت های قبلی را مرور فرمایید.


Page Split چیست؟

Page Split بمعنی تقسیم کردن یا دو نیم کردن است.

عامل بوجود آمدن Page Split در واقع Fragmentation است.
در مثال زیر سعی می کنیم، مشکل Page Split را بصورت واقعی نشان دهیم. در این مثال، Extent 1 شامل Page 1 و Page 2 است و Extent 2 شامل Page 3 است:

Extent 1
Page 1
پهلوان مهدی 2
احمدی نرگس 4
اصلانی نادر 6
طاهری مهدی 8
Page 2
محمدی امیر 10
عباسی احسان 12
دوستی مهشید 14
میلادی رضا 16






Extent 2
Page 3
نصوحی امیر 18
     
     
     







حالا قصد اضافه کردن رکورد شماره 5 را داریم که قائدتاً در Page 1 و بعد از رکورد 4 باید قرار بگیرد، اما اتفاقی که در عمل خواهد افتاد و منجر به Page Split خواهد شد، این است که ابتدا در Extent 2 یک Page جدید ایجاد می شود و سپس رکورد جدید به همراه رکورد شماره 6 و 8 به آن منتقل خواهد شد:

Extent 1
Page 1
پهلوان مهدی 2
احمدی نرگس 4
فضای غیرقابل استفاده
Page 2
محمدی امیر 10
عباسی احسان 12
دوستی مهشید 14
میلادی رضا 16






Extent 2
Page 3
نصوحی امیر 18
     
     
     
Page 4
نصوحی امیر 5
اصلانی نادر 6
طاهری مهدی 8
     

همان طور که قبلاً گفته شد هر Page به صفحه ی "قبلی"  و "بعدی" خودش اشاره می کند. بنابراین اگر صفحه ی قبلی و بعدی Page جاری دقیقاً Pageهای کناری خودش باشد، بهترین حالت ممکن اتفاق افتاده است و مشکل Fragmentation وجود نخواهد داشت، اما با توجه به شکل بالا، صفحه ی "بعدی" Page شماره یک، Page شماره چهار است که از لحاظ فیزیکی و منطقی یکسان نیست.

توجه: در مثال بالا، هِد هارد برای خواندن Page 1 و Page 4 مجبور است از Page 2 و Page 3 نیز عبور کند که این امر باعث افزایش I/O خواهد شد.

معایت Page Split

  1. Page Split باعث افزایش عملیات I/O خواهد شد.
  2. Page Split باعث افزایش Waiting ایندکس خواهد شد.
  3. Page Split باعث افزایش مدت زمان Locking جدول خواهد شد.

راه حل های رفع مشکل Fragmentation ناشی از Page Split

  1. Rebuild کردن ایندکس ها
  2. Reorganize کردن ایندکس ها
  3. استفاده از گزینه های Fillfactor و Pad_Index هنگام ساخت ایندکس ها
  4. Defrag کردن دیسک

در ادامه به اختصار در مورد هر کدام از موارد بالا، توضیحاتی را ارائه خواهد شد.


1- Rebuild کردن ایندکس ها

همان طور که می دانید عملیات های Insert / Update / Delete مختلف روی اطلاعات باعث ایجاد Fragmentation در داده های ایندکس خواهد شد و برای افزایش سرعت کوئری ها بهتر است هر از چند گاهی ایندکس ها را Rebuild نماییم.

  • زمان Rebuild، ایندکس مورد نظر بطور کامل پاک شده و مجدداً ساخته می شود.
  • با Rebuild کردن ایندکس ها، فضاهای غیرقابل استفاده، حذف خواهند شد.
  • عملیات Rebuild باعث می شود تا Statistics مربوط به ایندکس به روز رسانی شود.
  • عملیات Rebuild، بشدت Log سیستم را افزایش خواهد داد.

نکته مهم: پیشنهاد می شود اگر میزان fragmentation بزرگتر از 30 درصد باشد عملیات Rebuild و اگر کوچکتر از 30 درصد بود عملیات Reorganize انجام شود. (در ادامه همین بخش، با DMV ای آشنا می شوید که میزان fragmentation را گزارش خواهد داد.)

مثال: در این مثال، تمام ایندکس های تعریف شده روی جدول، Rebuild خواهند شد:

اسکریبت Rebuild کردن تمام ایندکس های یک جدول

ALTER INDEX ALL ON Table_Name REBUILD WITH (ONLINE=ON)

با استفاده از گزینه ONLINE و تنظیم آن با مقدار ON، عملیات Rebuild بصورت Online انجام خواهد شد و کاربران هنگام Rebuild ایندکس ها Wait نخواهند شد.

مثال: Rebuild کردن کلیه ایندکس ها

ساخت مجدد کلیه ایندکس ها

EXEC SP_MSFOREACHTABLE 'PRINT ''?'''
EXEC SP_MSFOREACHTABLE 'ALTER INDEX ALL ON ? REBUILD WITH(FILLFACTOR=85,PAD_INDEX=ON)'

در خط اول از اسکریبت بالا، با استفاده از پروسیجر SP_MSFOREACHTABLE لیست تمام جداول، چاپ خواهد شد.

ولی در خط دوم بجای علامت ؟ هر بار نام جدول قرار می گیرد و اسکریبت مربوط به Rebuild جدول مذکور ساخته شده و اجرا می شود و این کار تا آخرین جدول از پایگاه داده انجام خواهد شد.

گزینه FILLFACTOR و PAD_INDEX در ادامه توضیح داده خواهد شد.


2- Reorganize کردن ایندکس ها

  • در عملیات Reorganize، تنها داده ها در سطح Leaf Level مرتب خواهند شد.
  • Reorganize کردن ایندکس ها  Statistics ها را به روز رسانی نمی کند.

نکته مهم: همان طور که قبلا اشاره شد، پیشنهاد می شود اگر میزان Fragmentation کوچکتر از 30 درصد است، عملیات Reorganize انجام شود.

مثال: در این مثال، تمام ایندکس های تعریف شده روی جدول، Rebuild خواهند شد:

اسکریبت Rebuild کردن تمام ایندکس های یک جدول

ALTER INDEX ALL ON Table_Name REORGANIZE WITH (ONLINE=ON)

 با استفاده از گزینه REORGANIZE و تنظیم آن با مقدار ON، عملیات Rebuild بصورت Online انجام خواهد شد و کاربران هنگام REORGANIZE ایندکس ها Wait نخواهند شد.

گزینه های Fillfactor و Pad_Index در مطالب بعدی توضیح داده خواهد شد.


در ادامه آموزش Page Split خواهید دید...!

با خرید جلسه 5 از بسته آموزشی "افزایش کارایی پایگاه داده" موارد زیر را خواهید دید:

  1. با یک مثال عملی، مشکل Page Split نشان داده خواهد شد.
  2. چگونه می توان از میزان Page Split مربوط به داده های یک ایندکس مطلع شد.

دسترسی به موارد آموزشی بالا در بسته خریداری شده

  • شماره جلسه: 5
  • نام فایل ویدئو: 03
  • فرمت فایل: mp4.

نقطه شروع بحث بالا (Page Split) در ویدئو: 23:30


برای خرید و دانلود کاملآموزش پیشرفته SQL Server کلیک کنید.

READ MORE