آشنایی با مکانیسم Truncate Table

Blog Post Image 1400/04/27

ممکن است تصور شود که عمل Truncate Table در واقع Log نمی­‌شود و این عمل لاگ رکوردی را در Log File نمی ­‌نویسد، این تصور از آنجا ناشی می‌گردد که SQL Server می­‌تواند عملیات Truncate یک جدول بزرگ را با سرعت بسیار بالایی انجام دهد.

مثال زیر عدم صحت تصور فوق را نشان می‌­دهد. کد زیر یک Database و جدول ایجاد می­نماید و نشان می‌­دهد که ۱۰۰۰۰ رکورد درون جدول ذخیره گردیده است.

 

Use master
GO
Create Database MyDatabase
Alter Database MyDatabase Set Recovery Simple
GO
Use MyDatabase
GO
Create Table MyTable
(ID Int Identity Not Null, MyColumn Char(8000) Default 'Truncate Table')

Set Nocount On
GO
Insert Into MyTable Default Values
GO 10000
Select Count(*) As N'RowCount' From MyTable

قطعه کد زیر جدول ایجاد شده در مرحله قبل را درون یک Transaction در واقع Truncate می­‌نماید و تعداد رکوردهای جدول را نمایش می‌دهد:

 

Begin Transaction
 
 Truncate Table MyTable
 
 Select Count(*) As N'RowCount' From MyTable

همان­طور که مشاهده می­‌نمایید جدول خالی می­‌باشد و تعداد رکوردها برابر با صفر است. اما می­‌توانیم Transaction را Rollback نماییم و همه رکوردهای حذف شده به جدول باز خواهند گشت.

 

Rollback Transaction

Select Count(*) As N'RowCount' From MyTable
Row Count:  10000 

به وضوح مشخص است که عمل Truncate Table لاگ شده است در غیر این صورت عملیات Rollback انجام نمی­‌شد.

در ادامه دستور Truncate Table را مجدد اجرا می­‌نماییم و این بار تعداد Log Records را نیز بررسی می‌ کنیم ( دستور Truncate و Select مطابق تصویر زیر به صورت هم­زمان اجرا گردد)

CheckPoint
 GO 5
Truncate Table MyTable

 Select Count(*) As RowLogCount From fn_dblog (Null, Null)

همان­طور که در تصویر مشاهده می‌­گردد تعداد Log Records برابر با 23 می‌­باشد.

در مثال فوق هر رکورد جدول درون یک Data File Page قرار دارد زیرا هر ردیف شامل دو Field است، یکی از نوع Int و دیگری از نوع Char(8000) می­‌باشد و هر Data File Page ظرفیتی برابر با 8 کیلوبایت دارد.

به هر هشت Data File Page مجاور یک Extent گفته می­‌شود و به جدول MyTable قبل از اینکه Truncate شود 1250 تا Extent تعلق داشت.

اما عدد 23 (تعداد لاگ رکوردها) با هیچ کدام از اعداد 10000 (تعداد Pageها) و 1250 (تعداد Extentها) متناسب نیست! در ادامه با مکانیسم Deffered-Drop آشنا خواهیم شد.

مکانیسم Deffered-Drop کامل شدن عملیات­‌های Truncate Table و Drop Table را سریعا شبیه سازی می­‌کند، اما فضاهایی که به جدول تعلق دارد و شامل Pageها و Extentها است باید در واقع Deallocate شوند. بنابراین اطلاعات مربوطه را درون Deffered-Drop Queue قرار می­‌دهد، این اطلاعات بعدا توسط Background Task پردازش می‌­شوند. تا این جا کل این عملیات تعداد کمی Log Records ایجاد می‌­نماید.

Background Task هر چند ثانیه یک بار اجرا می­شود و همه Pageها و Extentهایی که اطلاعات آن‌­ها درون Deffered-Drop Queue قرار گرفته است را Deallocate می‌­نماید.

اگر بعد از چند ثانیه مجددا دستور زیر را اجرا نماییم تعداد Log Records برابر با 3797 خواهد بود.

ممکن است تعجب نمایید که چرا حداقل 10000 لاگ رکورد ایجاد نشد. (به ازای هر Page که Deallocate می­‌شود). این موضوع به این خاطر است که به ازای هر 8 تا Data File Page متوالی که Deallocate شدن آن­‌ها در PFS Page تاثیر می­‌گذارد یک لاگ رکورد نوشته می­‌شود. (البته لاگ رکوردهای سیستمی هم نوشته می­‌شوند.)

 

نتیجه گیری:

عمل Truncate Table به این خاطر سریع است که اولا از مکانیسم Deffered-Drop استفاده می­‌گردد، دوما به ازای حذف هر رکورد یک لاگ رکورد نوشته نمی­‌شود.

برای این مقاله تاکنون دیدگاهی ثبت نشده است, شما اولین نفر باشید...

ارسال نظرات

آدرس ایمیل شما منتشر نخواهد شد. قسمت های مورد نیاز علامت گذاری شده اند.