درون یک Page در SQL Server چه می گذرد؟

درون یک Page در SQL Server چه می گذرد؟

نوشته شده توسط: میلاد فیروزی
تاریخ انتشار: ۲۱ دی ۱۳۹۴
آخرین بروزرسانی: ۱۴ مهر ۱۴۰۲
زمان مطالعه: 6 دقیقه
۵
(۱)

در کل چند نوع Page در SQL Server داریم

  1.  Data Page
  2. Index Page
  3. System Page

همان طور که می دانید تمامی اطلاعات شما در SQL Server در Data Pageهایی به ظرفیت ۸ کیلوبایت ذخیره می گردند. SQL Server اطلاعات را سطر به سطر ذخیره می کند و خوب با احتساب این اطلاعات می توانید با توجه به تعریف جداولتان بفهمید در هر Page چند سطر از اطلاعات شما ذخیره می شوند ، به طور کلی هر چقدر تعداد سطرهایی که در یک Page ذخیره می شوند بیشتر باشد بهتر است چون SQL Server هر بازی که به سراغ یکی از Pageها می آید نمی تواند سطر خاصی را بخواند بلکه مجبور است تمام اطلاعات آن Page را بخواند ، در نتیجه هرچقدر سطرهای بیشتری در آن Page ذخیره شده باشند SQL با خواندن تعداد Pageهای کمتر اطلاعات بیشتری را می تواند واکشی کند و این نکته ایست که در طراحی جداول می تواند مورد بررسی قرار گیرد.یک Data Page همیشه از ۳ بخش تشکیل شده است.

  1. Page Header
  2. Payload
  3. Row Offset Array

 Page Header معمولا مستقل از نوع Page طولش ۹۶ بایت می باشد و اطلاعاتی نظیر Page Id و Object Id و … را در خود ذخیره می کند.هیجان انگیز ترین بخش Page قسمت Payload می باشد زیرا اطلاعات ما در این قسمت ذخیره می گردند.سرور از ۸۱۹۲ بایت کلی (۸ کیلوبایت) ۸۰۹۶ بایت برای این بخش در اختیار شما قرار می دهد و می توانید تعداد سطرهای ذخیره شده در یک Page را از همین ۸۰۹۶ بایت محاسبه کنید.

و نهایتا در آخرین قسمت Row Offset Array را داریم ، Row Offset Array نیز بخشی از همان ۸۰۹۶ بایت می باشد و برای هر سطر از دیتا ۲ بایت ذخیره می کند که نشان می دهد رکورد شما در کجای Page قرار دارد ، شناسایی این بخش به Indexگذاری به شما کمک خواهد کرد.نمای کلی یک Page را در تصویر ذیل می توانید مشاهده کنید.
بیایید یک جدول بسازیم ،
CREATE TABLE Customers
(
FirstName CHAR(50) NOT NULL,
LastName CHAR(50) NOT NULL,
Address CHAR(100) NOT NULL,
ZipCode CHAR(5) NOT NULL,
Rating INT NOT NULL,
ModifiedDate DATETIME NOT NULL,
)
GO
با توجه به این تعریف و با توجه با اندازه ی هر ستون حال می توانیم به راحتی محاسبه کنیم در صر Page چند سط جا می شود ،
  ۲۲۶ =  (۲ + ۵۰ + ۵۰ + ۱۰۰ + ۵ + ۴ + ۸ + ۷)
خوب با تقسیم ۸۰۹۶ بر ۲۲۶ به عدد ۳۵.۶ می رسیم ، این یعنی در این Page حداکثر ۳۵ رکورد ذخیره خواهد شد و بقیه فضای باقی مانده خالی باقی خواهند ماند ، در بدترین حالت اگر اندازه جدول شما ۴۰۳۱ بایت شود شما ۴۰۲۹ بایت را هدر داده اید ، پس شناختن ساختار صفحات می تواند تا حدود بسیار زیادی به تعریف درست جداول شما و Performance نهایی دیتابیس شما کمک کند.
با استفاده از Query زیر می توانید فضای هدر داده شده در Page توسط طراحی جدولتان را به دست آورید ،
 SELECT
DB_NAME(database_id),
SUM(free_space_in_bytes) / 1024 AS 'Free_KB'
FROM sys.dm_os_buffer_descriptors
WHERE database_id <> 32767
GROUP BY database_id
ORDER BY SUM(free_space_in_bytes) DESC
GO
در پایان امیدوارم این مقاله باعث شود تا در طراحی جداول دیتابیس خود این اطلاعات را به کار برده نهایتا به Performance دیتابیس کمک کنید.

چه رتبه ای می‌دهید؟

میانگین ۵ / ۵. از مجموع ۱

اولین نفر باش

title sign
معرفی نویسنده
میلاد فیروزی
مقالات
8 مقاله توسط این نویسنده
محصولات
0 دوره توسط این نویسنده
میلاد فیروزی
title sign
دیدگاه کاربران

    • با سلام.ممنون از مطلبتون.
      لطفا اگه میشه در مورد این اعداد یه توضیح بدید که از کجا اومدن ؟
      ۲۲۶ = (۲ + ۵۰ + ۵۰ + ۱۰۰ + ۵ + ۴ + ۸ + ۷)

    • با سلام.ممنون از مطلبتون.
      لطفا اگه میشه در مورد این اعداد یه توضیح بدید که از کجا اومدن ؟
      ۲۲۶ = (۲ + ۵۰ + ۵۰ + ۱۰۰ + ۵ + ۴ + ۸ + ۷)

    •     با سلام و عرض ادب

      ممنون بابت زحمات شما دوست عزیز . متاسفانه غلط دیگه در متن فوق زیاد دیده می شود . بنده نیز مانند سایر دوستان عدد بدست آمده (عدد ۲۲۶) را کاملا توضیح دهید لطفا . ممنون
    •     با سلام.ممنون از مطلبتون.

      لطفا اعداد ۲ و ۷ را توضیح بدهید که از کجا آمده اند؟
      و اگر قسمت Row Offset Array جزئی از همان ۸۰۹۶ بایت هستند ژس تقسیم ۸۰۹۶ بر ۲۲۶ صحیح نیست چون قسمتی از همین فضای ۸۰۹۶ ای توسط Row Offset Array گرفته شده است.
    • ظرفیت مجاز برای استفاده از هر Page در Data File برابر با ۸۰۵۳ بایت می باشد.

    •    با درود
      سپاس از مقاله خوبتون
      دو سوال که ممکنه خیلی ابتدایی باشد اما ممنون میشم پاسخ دهید
        ۲۲۶ =  (۲ + ۵۰ + ۵۰ + ۱۰۰ + ۵ + ۴ + ۸ + ۷) نحوه محاسبه چون اولین و آخرین عدد را متوجه نمیشم چیه؟
      ۲ – کوئری را اجرا کردم و برای هر دیتا بیس مقداری آزاد را نشان داد از کجا متوجه بشم مربوط به کدام جدول است

      با سپاس

    •     مثل همیشه عالی و کابردی و روان 

    •     با سلام ممنون از مقاله خوبتون بسیار عالی بود