۵
(۱)

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

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

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 برابر با ۲۳ می‌­باشد.
در مثال فوق هر رکورد جدول درون یک Data File Page قرار دارد زیرا هر ردیف شامل دو Field است، یکی از نوع Int و دیگری از نوع Char(8000) می­‌باشد و هر Data File Page ظرفیتی برابر با ۸ کیلوبایت دارد. به هر هشت Data File Page مجاور یک Extent گفته می­‌شود و به جدول MyTable قبل از اینکه Truncate شود ۱۲۵۰ تا Extent تعلق داشت. ما عدد ۲۳ (تعداد لاگ رکوردها) با هیچ کدام از اعداد ۱۰۰۰۰ (تعداد Pageها) و ۱۲۵۰ (تعداد 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 برابر با ۳۷۹۷ خواهد بود.

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

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

سخن پایانی

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

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

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

اولین نفر باش