علیرضا حیدری
علیرضا حیدری
خواندن ۵ دقیقه·۵ سال پیش

معماری و ساختار Page در SQL Server

انواع مختلفی از Page ها در SQL Server وجود دارد که هر کدام وظیفه ای را به عهده دارند که با شناخت عملکرد و معماری آنها میتوانیم نقاط مشکل ساز سیستم را رفع کنیم به عنوان مثال فرض کنید سیستم ما از لحاظ Performance دچار مشکل شده است ما با شناخت معماری آنها میتوانیم متوجه شویم مشکل به وجود آمده چیست و چگونه باید در رفع آن بکوشیم .ما در این مقاله به معرفی Data Page ها عملکرد و بررسی آنها میپردازیم و در آخر برای درک بیشتر مثالی را ارائه خواهیم داد.

در واقع تمام رکورد ها , دیتاها و هر آنچه که قابل ذخیره سازی در دیتابیس ما است در قالب Page ها ذخیره میشوند که این Pageها داخل Data File ها وجود دارند و باید به این نکته اشاره کرد که Log File مفهومی به نام Page ندارد. همچنین لازم به ذکر است که عملیات IO به ازای این Page ها انجام میشود در واقع رکورد های ما وقتی بخواهند از روی دیسک واکشی شوند در قالب این بلوک 8 کیلو بایتی روی حافظه میآید و مورد پردازش قرار میگیرد همانطور که اشاره کردیم ظرفیت این Page ها 8 کیلوبایت است.که تنها 8060 بایت در دسترس است. Page ها فرمت آدرس دهی مربوط به خود میباشد که این آدرس دهی به شکل زیر میباشد

File ID : Page Number -----> 1:501

به این معنی میباشد که دیتافایل شماره 1 و پیج شماره 501

وقتی ما از Page صحبت میکنیم , یک ساختار و قاعده ای مشخصی وجود دارد که شامل 3 قسمت اصلی میباشد که شامل موارد زیر است

  • Page Header
  • Data Row
  • Row Offset
Page Architecture
Page Architecture

بررسی Page Header :

در این قسمت پر از اطلاعات سیستمی وجود دارد که ظرفیت آن 96 بایت است . از این اطلاعات میتوان به مشخص کردن Page های مربوط به Object خاص , مشخص کردن آدرس های مربوط به Page های قبل و بعد از خود (در صورت وجود داشتن Index) , تعداد رکوردها , شماره Page و Checksum مربوط به Page ها و موارد دیگر اشاره کرد.

بررسی Data Row :

محلی برای ذخیره , ویرایش و حذف رکوردهای ما میباشد . حداکثر طول رکوردها 8060 بایت است . داده های ما در اینجا پشت سر هم ذخیره میشوند و قسمت Free Space آن مشخص کننده این است که هنوز داده هایی برای ذخیره وجود ندارد

بررسی Row Offset :

Page Architecture - Row Offset
Page Architecture - Row Offset


ظرفیت این قسمت 36 بایت میباشد . مرتب سازی Data Rowها در این قسمت میباشد توجه داشته باشید که وقتی رکوردی درج میشود همانطور که قبلا ذکر شده بود این رکوردها پشت سرهم درج میشود و وظیفه ی مرتب سازی آنها در Row Offset است همونطور که در شکل بالا ملاحظه میفرمایید با جا به جا شدن این Offset ها داده های ما مرتب میشود.



بررسی سناریو کاربردی :

فرض کنید دیتابیسی وجود دارد به اسم PageStructure ما برای اینکه متوجه بشویم که دیتابیس ما چه فایل هایی دارد از دستور sp_helpfile استفاده میکنیم که خروجی این store procedure به شکل زیر میباشد


sp_helpfile
sp_helpfile

همانطور که میبیند ما در اینجا دوتا فایل داریم که یکی دیتا فایل ما است و تمامی Page ها در آنجا ذخیره میشود و آن یکی لاگ فایل است که مفهومی به نام Page ندارد. توجه داشته باشید که میتوانیم بسته به نیازمان تعداد دیتافایل های بیشتری داشته باشیم.

با استفاده از دستور زیر ما جدولی به نام PageTable میسازیم و مقدار 10000 رکورد در آن درج میکنیم

ما برای بدست آوردن Page های مربوط به یک جدول خاص از دستور زیر استفاده میکنیم

و خروجی دستور بالا بصورت زیر میباشد.

همانطور که میبینید Page های مربوط به جدول مورد نظر با این دستور استخراج شد که در PagePID قابل مشاهده میباشد. توجه داشته باشید که هر Page شامل یک IAM Page میباشد که مخفف

آن Index Allocation Map میباشد که SQL Server با استفاده از آن متوجه میشود که هر Page متعلق به کدام شئ میباشد ظرفیت آن 4GB میباشد و Page Type آن همانطور که در خروجی بالا میبینید 10 میباشد.

اما داده های ما که همان Data Page ها میاشد در Page Type شماره 1 قابل مشاهده است که رکوردها در داخل آن ذخیره شده است که آدرس آن 330, 331,... میباشد

همانطور که در در دستور زیر مشاهده میکنید یک تابعی وجود دارد به اسم sys.fn_PhysLocFormatter وقتی ما این تابع را در جدول مورد نظر صدا میزنیم تمامی رکوردها با FileID و Page مربوط به آن و همچنین شماره رکورد مورد نظر استخراج میشود.

خروجی مورد نظر به صورت زیر میباشد.

اگر بخاطر داشته باشید ما در ابتدای مقاله یک شکلی نمادین از معماری Page و ساختار آن ارائه دادیم حال میخواهیم محتویات داخل یک Page را Dump کنیم

همانطور که در دستور بالا مشاهده میکنید ما قبل از اجرا کردن دستور DBBC PAGE باید فلگی به شماره 3604 را ON کنیم تا بتوانیم محتویات Page را ببنیم توجه داشته باشد که باید دسترسی SA داشته باشید دستور DBCC PAGE شامل پارامترهایی میباشد که این پارامترها به صورت زیر میباشد.

DBCC PAGE ( \{dbid | dbname\}, filenum, pagenum \[, printopt\] \[, cache\] )

خروجی دستور مربوطه به شکل زیر میباشد. توجه داشته باشید که به دلیل حجم اطلاعات خروجی در چند مرحله نمایش داده میشود

Page Header :


Data Row :

Row Offset :



موفق باشید.

databasesqlserversqlserverdevelopersqltuningدیتابیس
SQL Server Database Administration, Programmer
شاید از این پست‌ها خوشتان بیاید