تفاوت بین دستورات Truncate و Delete در SQL Server
تفاوت بین دستورات Truncate و Delete در SQL Server شامل سرعت اجرا، ثبت لاگ، ریست شدن Identity و نحوه حذف دادهها است.
تفاوت بین دستورات TRUNCATE و DELETE در SQL Server
در SQL Server برای حذف دادهها از جداول معمولاً از دو دستور مهم DELETE و TRUNCATE TABLE استفاده میشود.
هر دو دستور وظیفه حذف دادهها را بر عهده دارند، اما نحوه عملکرد، سرعت اجرا، میزان ثبت در Transaction Log، تأثیر بر Identity و محدودیتهای آنها کاملاً متفاوت است.
بسیاری از برنامهنویسان و مدیران پایگاه داده در انتخاب بین DELETE و TRUNCATE دچار تردید میشوند.
انتخاب نادرست میتواند باعث کاهش عملکرد سیستم، مصرف بیش از حد فضای Log یا حتی از دست رفتن اطلاعات شود.
بنابراین آشنایی با تفاوتهای این دو دستور برای هر فردی که با SQL Server کار میکند ضروری است.
دستور DELETE چیست؟
دستور DELETE برای حذف یک یا چند رکورد از جدول استفاده میشود.
ساختار کلی:
DELETE FROM Customers;
این دستور تمام رکوردهای جدول Customers را حذف میکند.
همچنین میتوان با شرط خاص تنها برخی از رکوردها را حذف کرد.
مثال:
DELETE FROM Customers
WHERE CustomerID = 10;
در این حالت فقط رکورد موردنظر حذف خواهد شد.
دستور TRUNCATE TABLE چیست؟
دستور TRUNCATE TABLE برای حذف تمامی دادههای یک جدول استفاده میشود.
ساختار:
TRUNCATE TABLE Customers;
این دستور تمام رکوردهای جدول را حذف میکند اما ساختار جدول باقی میماند.
مهمترین تفاوت DELETE و TRUNCATE در SQL Server
بزرگترین تفاوت این دو دستور در نحوه حذف دادهها است.
-
DELETE
رکوردها را به صورت سطری حذف میکند. -
TRUNCATE
کل صفحات داده (Data Pages) را آزاد میکند.
به همین دلیل TRUNCATE معمولاً بسیار سریعتر است.
تفاوت در سرعت اجرا
یکی از مهمترین تفاوتها مربوط به عملکرد است.
-
DELETE
هنگام حذف هر رکورد:
-
- رکورد بررسی میشود.
- لاگ ثبت میشود.
- Triggerها اجرا میشوند.
- محدودیتها کنترل میشوند.
در جداول بزرگ این فرآیند زمانبر خواهد بود.
مثال:
DELETE FROM Orders;
در جدول چند میلیون رکوردی ممکن است مدت زیادی طول بکشد.
-
TRUNCATE
در TRUNCATE نیازی به حذف تکتک رکوردها نیست.
SQL Server فقط صفحات داده را آزاد میکند.
TRUNCATE TABLE Orders;
به همین دلیل اجرای آن بسیار سریعتر است.
تفاوت در Transaction Log
تمام عملیات SQL Server در Transaction Log ثبت میشوند.
-
DELETE
برای هر رکورد یک عملیات لاگ ثبت میشود.
مثال:
DELETE FROM Orders;
اگر جدول دارای 5 میلیون رکورد باشد، اطلاعات زیادی در Log ذخیره خواهد شد.
-
TRUNCATE
فقط آزاد شدن صفحات ثبت میشود.
بنابراین حجم Log بسیار کمتر خواهد بود.
این ویژگی باعث بهبود عملکرد میشود.
🌟 آیا میخواهید به یک متخصص پایگاه داده تبدیل شوید و در دنیای فناوری اطلاعات بدرخشید؟با دوره آموزشی SQL Server ما، شما میتوانید به راحتی و با روشی عملی، تمام مهارتهای لازم را یاد بگیرید!
این دوره به شما آموزش میدهد که چگونه دادهها را به بهترین شکل مدیریت کنید، گزارشهای قدرتمند بسازید و به تحلیلهای عمیق دست یابید.
با محتوای جذاب و پروژههای واقعی، شما نه تنها تئوری را یاد میگیرید، بلکه تواناییهای عملی خود را نیز تقویت میکنید.
پس فرصت را از دست ندهید! همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده شغلی روشنتر بردارید!
⇐همین حالا شروع کنید و به دنیای دادهها بپیوندید!
تفاوت در استفاده از WHERE
DELETE از شرط WHERE پشتیبانی میکند.
مثال:
DELETE FROM Employees
WHERE DepartmentID = 2;
تنها رکوردهای موردنظر حذف میشوند.
اما TRUNCATE از WHERE پشتیبانی نمیکند.
کد زیر نامعتبر است:
TRUNCATE TABLE Employees
WHERE DepartmentID = 2;
TRUNCATE همیشه کل جدول را پاک میکند.
تفاوت در Identity Column
یکی از تفاوتهای مهم مربوط به ستون Identity است.
فرض کنید جدول زیر را داریم:
CREATE TABLE Users
(
ID INT IDENTITY(1,1),
Name NVARCHAR(100)
);
-
رفتار DELETE
DELETE FROM Users;
پس از حذف دادهها مقدار Identity ریست نمیشود.
اگر رکورد جدید وارد کنیم:
INSERT INTO Users(Name)
VALUES('Ali');
ممکن است شناسه جدید برابر 101 باشد.
-
رفتار TRUNCATE
TRUNCATE TABLE Users;
در این حالت مقدار Identity به مقدار اولیه بازمیگردد.
رکورد بعدی:
INSERT INTO Users(Name)
VALUES('Ali');
شناسه برابر 1 خواهد بود.
تفاوت در Triggerها
-
DELETE
Triggerهای نوع DELETE اجرا میشوند.
مثال:
CREATE TRIGGER trg_Delete
ON Customers
AFTER DELETE
AS
BEGIN
PRINT 'Record Deleted'
END
اجرای دستور:
DELETE FROM Customers;
باعث فعال شدن Trigger میشود.
-
TRUNCATE
Triggerها اجرا نمیشوند.
TRUNCATE TABLE Customers;
هیچ Triggerی فعال نخواهد شد.
تفاوت در Foreign Key
یکی از محدودیتهای مهم TRUNCATE مربوط به کلیدهای خارجی است.
فرض کنید جدول:
Orders
به جدول:
-
Customers
وابسته باشد.
-
DELETE
در صورت رعایت محدودیتها قابل اجرا است.
DELETE FROM Customers;
TRUNCATE
در بسیاری از موارد اجرا نمیشود.
TRUNCATE TABLE Customers;
خطا:
Cannot truncate table because it is referenced by a FOREIGN KEY constraint.
تفاوت در Locking
- DELETE معمولاً Row Lock یا Page Lock ایجاد میکند.
- در جداول بزرگ ممکن است به Table Lock تبدیل شود.
- TRUNCATE از Table Lock استفاده میکند.
- این موضوع باعث سرعت بیشتر اما محدودیت بیشتر در همزمانی عملیات میشود.
امکان Rollback
یکی از سوالات رایج مربوط به برگشت عملیات است.
-
DELETE
در تراکنش قابل بازگشت است.
BEGIN TRAN;
DELETE FROM Customers;
ROLLBACK;
تمام دادهها باز خواهند گشت.
-
TRUNCATE
در SQL Server نیز داخل تراکنش قابل Rollback است.
BEGIN TRAN;
TRUNCATE TABLE Customers;
ROLLBACK;
تفاوت در مصرف منابع
DELETE منابع بیشتری مصرف میکند زیرا:
-
هر رکورد بررسی میشود.
-
Log بیشتری تولید میشود.
-
Trigger اجرا میشود.
-
Constraintها کنترل میشوند.
-
TRUNCATE مصرف منابع بسیار کمتری دارد.
-
به همین دلیل در جداول بزرگ گزینه مناسبی است.
بررسی عملکرد در جداول بزرگ
فرض کنید جدولی با 10 میلیون رکورد داریم.
-
استفاده از DELETE
DELETE FROM SalesHistory;
ممکن است چند دقیقه یا حتی چند ساعت زمان ببرد.
-
استفاده از TRUNCATE
TRUNCATE TABLE SalesHistory;
معمولاً در چند ثانیه انجام میشود.
موارد مناسب برای DELETE در SQL Server
DELETE زمانی مناسب است که:
- فقط بخشی از دادهها حذف شوند.
- شرط WHERE مورد نیاز باشد.
- Triggerها باید اجرا شوند.
- ساختار امنیتی خاصی وجود داشته باشد.
- اطلاعات باید به صورت کنترل شده حذف شوند.
مثال:
DELETE FROM Orders
WHERE OrderDate < '2023-01-01';

موارد مناسب برای TRUNCATE در SQL Server
TRUNCATE زمانی مناسب است که:
- کل دادههای جدول حذف شوند.
- سرعت اهمیت زیادی داشته باشد.
- جدول دارای Foreign Key نباشد.
- نیاز به ریست شدن Identity وجود داشته باشد.
- حجم داده بسیار زیاد باشد.
مثال:
TRUNCATE TABLE TempData;
مقایسه DELETE و TRUNCATE در SQL Server
| ویژگی | TRUNCATE | DELETE |
| حذف شرطی | دارد | ندارد |
| سرعت اجرا | کمتر | بیشتر |
| ثبت در Log | زیاد | کم |
| اجرای Trigger | بله | خیر |
| ریست Identity | خیر | بله |
| حذف رکوردها | سطری | صفحهای |
| پشتیبانی از WHERE | بله | خیر |
| نیاز به بررسی FK | کمتر | بیشتر |
| مناسب برای حذف بخشی از دادهها | بله | خیر |
| مناسب برای حذف کامل دادهها | متوسط | عالی |
نکات مهم هنگام استفاده DELETE و TRUNCATE در SQL
-
قبل از DELETE
- از شرط WHERE مطمئن شوید.
- نسخه پشتیبان تهیه کنید.
- تأثیر روی Log را بررسی کنید.
-
قبل از TRUNCATE
- وابستگیهای Foreign Key را بررسی کنید.
- از نیاز به ریست شدن Identity مطمئن شوید.
- مطمئن شوید کل دادهها باید حذف شوند.
خطاهای رایج DELETE و TRUNCATE در SQL
-
فراموش کردن WHERE
DELETE FROM Users;
ممکن است به اشتباه تمام اطلاعات حذف شوند.
-
استفاده از TRUNCATE روی جدول دارای FK
TRUNCATE TABLE Customers;
باعث خطا خواهد شد.
-
عدم توجه به Identity
برخی کاربران انتظار دارند DELETE مقدار Identity را ریست کند، در حالی که چنین اتفاقی رخ نمیدهد.
جمعبندی
دستورات DELETE و TRUNCATE هر دو برای حذف دادهها در SQL Server استفاده میشوند اما تفاوتهای مهمی دارند.
DELETE رکوردها را به صورت سطری حذف میکند، از WHERE پشتیبانی میکند، Triggerها را اجرا میکند و مقدار Identity را تغییر نمیدهد.
در مقابل، TRUNCATE کل دادههای جدول را با سرعت بسیار بالا حذف میکند، حجم کمی از Transaction Log را مصرف میکند و مقدار Identity را به حالت اولیه بازمیگرداند.
انتخاب بین این دو دستور باید براساس حجم دادهها، نیاز به حذف شرطی، وجود Foreign Key و الزامات عملکردی سیستم انجام شود.


کاربران ما
شما هم نظرتون با ما دریاره “تفاوت بین دستورات Truncate و Delete در SQL Server” اشتراک بزارید
برای ارسال نظر لطفا ورود یا ثبت نام کنید