نیک آموز > وبلاگ > SQL Server > تاثیرات Page split در SQL Server تاثیرات Page split در SQL Server SQL Server افزایش سرعت SQL Server نوشته شده توسط: تورج عزیزی تاریخ انتشار: 14 مهر 1394 آخرین بروزرسانی: 29 بهمن 1403 زمان مطالعه: 4 دقیقه 5 (1) تاثیرات Page split، این مقاله در مورد هزینه تحمیلی Page split بر Performance کلی دیتابیس است. از آنجایی که SQL Server باید نظم فیزیکی رکورد ها را بر اساس کلید ایندکس حفظ کند در صورتی که در Page مربوطه جایی برای گنجاندن رکورد جدید نباشد پایگاه داده SQL Server باید حدود 50% از رکوردهای درون Page را به Page ای جدید انتقال دهد تا جا برای رکورد جدید باز شود البته برای رکوردهای بزرگ ممکن است با یک Page split مشکل حل نشود و رکوردهای بیشتری نیاز به انتقال داشته باشند. فهرست محتوایی Toggle تاثیرات Page splitسخن پایانی تاثیرات Page split البته یافتن فضای خالی در فایل دیتابیس و تخصیص Page هم هزینه دیگری است که Page split به همراه دارد. Page split همیشه عملی گران قیمت محسوب می شده است، اما تا چه حد؟ قصد دارم با استفاده از یک DMV به نام sys.dm_tran_database_transactions به شما نشان دهم وقتی یک page در یک ایندکس می بایست split شود تا چه حد log بیشتری در فایل transaction log تولید می شود. با این اسکریپت یک جدول با ردیف های تقریباً 1000 بایت می سازیم. همجنین شما میتوانید کوئری نویسی را به صورت گامبهگام از نیک آموز فرا بگیرید. CREATE DATABASE PageSplitTest; GO USE pagesplittest; GO CREATE TABLE BigRows (c1 INT, c2 CHAR (1000)); CREATE CLUSTERED INDEX BigRows_CL ON BigRows (c1); GO INSERT INTO BigRows VALUES (1, 'a'); INSERT INTO BigRows VALUES (2, 'a'); INSERT INTO BigRows VALUES (3, 'a'); INSERT INTO BigRows VALUES (4, 'a'); INSERT INTO BigRows VALUES (6, 'a'); INSERT INTO BigRows VALUES (7, 'a'); GO برای رکورد با مقدار c1 = 5 یک “شکاف” ایجاد کرده ایم. منظور از شکاف این نیست که جایش رزرو شده بلکه صرفاً این مقدار از نظر منطقی جا انداخته شده است. اجازه دهید با یک تراکنش Explicit یک رکورد دیگر را اضافه کنیم: BEGIN TRAN INSERT INTO BigRows VALUES (8, 'a'); GO SELECT [database_transaction_log_bytes_used] FROM sys.dm_tran_database_transactions WHERE [database_id] = DB_ID ('PageSplitTest'); GO database_transaction_log_bytes_used ———————————– 1228 مقدار لاگ تولید شده منطقی است و آن چیزی است که انتظارش را داشتیم. حالا اگر بخواهم رکورد با مقدار c1=5 را اضافه کنم این رکورد برای حفظ نظم فیزیکی رکوردها (البته از طریق slot array انتهای page) باید به همین Page اضافه شود، در اینجا Page split اتفاق می افتد. افراد علاقهمند میتوانند با مطالعه مقاله پرکاربردترین دستورات SQL Server، دانش خود را در زمینه کوئرینویسی گسترش دهند. — commit previous transaction COMMIT TRAN GO BEGIN TRAN INSERT INTO BigRows VALUES (5, 'a'); GO SELECT [database_transaction_log_bytes_used] FROM sys.dm_tran_database_transactions WHERE [database_id] = DB_ID ('PageSplitTest'); GO database_transaction_log_bytes_used ———————————– 6724 5.5 برابر لاگ بیشتر که ناشی از لاگ تراکنش سیستمی است که عمل Page split را انجام می دهد! این نرخ اگر اندازه ردیف کوچکتر شود می تواند بدتر هم بشود. برای ردیفی با اندازه 100 بایت (از همان کد بالا استفاده کنید فقط به CHAR(100) تغییر دهید) 67 ردیف را درج کنید و البته یک شکاف هم ایجاد کنید (یعنی یک کلید را جا بیندازید مثل c1=5 در بالا) با درج رکورد 68 ام Page split روی میدهد و دو عدد برابر 328 و 5924 خواهند بود (یعنی اندازه لاگ تولید شده قبل و بعد از Page split و البته در تست شما این مقادیر می تواند متفاوت باشد). Page split روی داده در این حالت 18 برابر لاگ بیشتر تولید کرده! سخن پایانی برای ردیفی با اندازه 10 بایت من به دو عدد 240 و 10436 رسیدم ، چون من داده های دارای انحراف در یونیک بودن تولید کردیم: نوع دیتاتایپ را به CHAR (10) تغییر دادم و سپس مقادیر 1 ، 2، 3 ، 4، 6 و 7 را یکبار و مقدار 8 را 256 بار درج کردم و بعد دو بار مقدار 5 را درج کردم که باعث روی دادن Page split از نوع non-middle شد (یعنی نصف رکوردهای انتقالی همگی یک مقدار داشتند (8)). Storage Engine همیشه یک Page split از نوع 50/50 انجام نمی دهد بلکه عمل انتقال رکورد ها را تا آنجایی ادامه می دهد که فضای کافی برای رکورد جدید باز شود (یعنی چندین بار عمل انتقال می تواند صورت بگیرد). در این حالت 43 برابر لاگ بیشتر تولید شد! ما در نیک آموز منتظر نظرات ارزشمند شما درباره این مقاله هستیم. چه رتبه ای میدهید؟ میانگین 5 / 5. از مجموع 1 اولین نفر باش دانلود مقاله تاثیرات Page split در SQL Server فرمت PDF 2 صفحه حجم 11 مگابایت دانلود مقاله معرفی نویسنده مقالات 18 مقاله توسط این نویسنده محصولات 0 دوره توسط این نویسنده تورج عزیزی مقالات مرتبط 06 دی SQL Server معرفی ویژگیهای جدید SQL Server 2025 مسعود طاهری 22 آذر SQL Server مفهوم DAC Connection در SQL Server تیم فنی نیک آموز 16 مهر SQL Server مفهوم Pagination در نحوه نمایش اطلاعات (رکوردها) تیم فنی نیک آموز 02 آبان SQL Server ابزار Database Engine Tuning Advisor تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ محسن بندامیر 08 / 08 / 94 - 10:09 مقاله جالبی بود.اما در حالت Char(100 فکر کنم منظورتون 77 و 78 بوده به جای اعداد 67و68 چون هر صفحه 8060 Byte فضا داره و هر رکوردمون شده اینجا 104 Bye در نتیجه: 8060/104=77.5 پاسخ به دیدگاه en.bakhtiari@yahoo.com 06 / 08 / 94 - 08:37 راه حل این مشکل هم اگر بیان می شد خوب بود پاسخ به دیدگاه مسعود طاهری 06 / 08 / 94 - 08:56 1- Rebuild یا Reorganize کردن ایندکس ها (با توجه به شرایط) 2- تنظیم درست Fillfactor 3- پرهیز از ایجاد ایندکس های اشتباه 4- و… این ها مواردی است که باعث جلوگیری از این اتفاقات می شود. پاسخ به دیدگاه تورج عزیزی 19 / 07 / 94 - 09:04 و البته یک نکته بسیار مهم دیگر هم اینکه در حین انجام عمل Page Split ، پیج حاوی رکورد ها با استفاده از Latch قفل شده و تراکنش هایی که درخواست انجام خواندن یا نوشتن روی این Page دارند Block می شوند. پاسخ به دیدگاه حمید ج. فرد 18 / 07 / 94 - 08:25 البته این موضوع رابطه خیلی شدید و نزدیکی با fill factor دارد پاسخ به دیدگاه تورج عزیزی 18 / 07 / 94 - 01:34 http://www.sqlballs.com/2012/08/how-to-find-bad-page-splits.html پاسخ به دیدگاه تورج عزیزی 18 / 07 / 94 - 01:34 http://www.sqlballs.com/2012/08/how-to-find-bad-page-splits.html پاسخ به دیدگاه تورج عزیزی 18 / 07 / 94 - 01:21 یک مقاله فوق العاده برای مطالعه بیشتر: پاسخ به دیدگاه Hamid J. Fard 18 / 07 / 94 - 01:02 « Storage Engine همیشه یک Page split از نوع ۵۰/۵۰ انجام نمی دهد بلکه عمل انتقال رکورد ها را تا آنجایی ادامه می دهد که فضای کافی برای رکورد جدید باز شود» در رابطه با جمله بالا. نکته اینجاست که عمل 50/50 یک بار اجرا شده و بعد فضای کافی برای رکورد جدید چک می شود اگر رکورد جدید در datapage دوم جا نشود یک data page جدید ساخته شده و رکورد در آن جای می گیرد. مقاله خوبی بود. موفق باشید. پاسخ به دیدگاه مسعود طاهری 18 / 07 / 94 - 09:51 عالی بود تورج جان. در ادامه این مبحث اگر وقت کردید DMV زیر را هم برای مانیتور کردن وضعیت Fragmentation ایندکس ها معرفی کنید https://msdn.microsoft.com/en-us/library/ms188917.aspx متشکرم پاسخ به دیدگاه مسعود طاهری 18 / 07 / 94 - 09:51 عالی بود تورج جان. در ادامه این مبحث اگر وقت کردید DMV زیر را هم برای مانیتور کردن وضعیت Fragmentation ایندکس ها معرفی کنید https://msdn.microsoft.com/en-us/library/ms188917.aspx متشکرم پاسخ به دیدگاه