خانه SQL Server آشنایی با مکانیسم Truncate Table SQL Server دستورات SQL نوشته شده توسط: مهدی قپانوری تاریخ انتشار: ۱۳ تیر ۱۴۰۰ آخرین بروزرسانی: ۱۹ مهر ۱۴۰۲ زمان مطالعه: 10 دقیقه ۵ (۱) مقدمه Truncate Tableجهت پاک نمودن دادههای یک Table یا Partitionهای یک Partitioned Table مورد استفاده قرار میگیرد. عمل Truncate بسیار سریع انجام میشود. در این مقاله قصد داریم توضیح دهیم که SQL Server چگونه این کار را انجام میدهد. ممکن است تصور شود که عمل 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 برابر با ۲۳ میباشد. در مثال فوق هر رکورد جدول درون یک 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 استفاده میگردد، دوما به ازای حذف هر رکورد یک لاگ رکورد نوشته نمیشود. برای بدست آوردن اطلاعات بیشتر در مورد دیگر دستورات SQL ، به مقاله زیر مراجعه کنید. چه رتبه ای میدهید؟ میانگین ۵ / ۵. از مجموع ۱ اولین نفر باش دانلود مقاله آشنایی با مکانیسم Truncate Table فرمت PDF 3 صفحه حجم 1 مگابایت دانلود مقاله معرفی نویسنده مقالات 15 مقاله توسط این نویسنده محصولات 1 دوره توسط این نویسنده مهدی قپانوری مهدی قپانوری بیش از 6 سال است که در زمینههای نرم افزار و بانک اطلاعاتی فعالیت مینماید. تخصص اصلی او در بانک اطلاعاتی SQL Server بوده و دارای تجربه در حوزههایPerformance Tuning، Database Administration، Database Development و طراحی سیستمهای OLTP میباشد. مهدی علاقهمند به R&D در حوزههای نوین SQL Server است. معرفی محصول ایمان باقری دوره آموزشی کوئری نویسی در SQL Server 2.190.000 تومان مقالات مرتبط ۰۲ آبان SQL Server ابزار Database Engine Tuning Advisor؛ مزایا، کاربردها و روش استفاده تیم فنی نیک آموز ۱۵ مهر SQL Server معرفی Performance Monitor ابزار مانیتورینگ SQL Server تیم فنی نیک آموز ۱۱ مهر SQL Server راهنمای جامع مانیتورینگ بکاپ ها در SQL Server تیم فنی نیک آموز ۰۸ مهر SQL Server Resource Governor چیست؟ آشنایی با نحوه پیکربندی و اهمیت های آن تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ مهدی قپانوری ۰۵ / ۰۵ / ۰۰ - ۰۵:۴۱ Nonclustered Index ها پاسخ به دیدگاه صمد فراهانی ۲۶ / ۰۴ / ۰۰ - ۱۰:۴۷ با سلام، یک سوال داشتم، آیا Truncate کردن یک یا چند پارتیشن باعث Fragment شدن ایندکس های جدول می شود؟ ممنون میشم راهنمایی کنید. پاسخ به دیدگاه آرزو محمدزاده ۰۴ / ۰۵ / ۰۰ - ۱۰:۰۰ درود بر شما بستگی به این دارد که پارتیشن فانکشن روی چه ستونی تعریف شده باشد. ایندکسی که روی آن ستون است خیلی fragment نمیشود اما ایندکس های دیگر بسیار fragment شده و نیاز به rebuild دارند. من روی دیتا ۶۰ میلیون (تستی) انجام دادم. بر روی ایندکس های که پارتیشن روی آنها انجام شد و همان فایل Fragment ایجاد میشد. مابقی ایندکس و فایل گروپ Fragment ندارند. پاسخ به دیدگاه مهدی قپانوری ۰۵ / ۰۵ / ۰۰ - ۰۵:۱۴ سلام، بستگی به Align بودن یا نبودن Nonclusterd Index ها دارد، می توانیم Nonclusterd Index ها را نیز پارتیشن نمائیم اما باید به تبعات این کار توجه داشته باشیم که تاثیر منفی بر روی Performance نداشته باشد. موفق باشید. پاسخ به دیدگاه صمد فراهانی ۲۶ / ۰۴ / ۰۰ - ۱۰:۴۷ با سلام، یک سوال داشتم، آیا Truncate کردن یک یا چند پارتیشن باعث Fragment شدن ایندکس های جدول می شود؟ ممنون میشم راهنمایی کنید. پاسخ به دیدگاه آرزو محمدزاده ۰۴ / ۰۵ / ۰۰ - ۱۰:۰۰ درود بر شما بستگی به این دارد که پارتیشن فانکشن روی چه ستونی تعریف شده باشد. ایندکسی که روی آن ستون است خیلی fragment نمیشود اما ایندکس های دیگر بسیار fragment شده و نیاز به rebuild دارند. من روی دیتا ۶۰ میلیون (تستی) انجام دادم. بر روی ایندکس های که پارتیشن روی آنها انجام شد و همان فایل Fragment ایجاد میشد. مابقی ایندکس و فایل گروپ Fragment ندارند. پاسخ به دیدگاه مهدی قپانوری ۰۵ / ۰۵ / ۰۰ - ۰۵:۱۴ سلام، بستگی به Align بودن یا نبودن Nonclusterd Index ها دارد، می توانیم Nonclusterd Index ها را نیز پارتیشن نمائیم اما باید به تبعات این کار توجه داشته باشیم که تاثیر منفی بر روی Performance نداشته باشد. موفق باشید. پاسخ به دیدگاه