"

تفاوت بین دستورات Truncate و Delete در SQL Server,مهم‌ترین تفاوت DELETE و TRUNCATE در SQL Server,مقایسه DELETE و TRUNCATE در SQL Server

تفاوت بین دستورات Truncate و Delete در SQL Server

تفاوت بین دستورات Truncate و Delete در SQL Server شامل سرعت اجرا، ثبت لاگ، ریست شدن Identity و نحوه حذف داده‌ها است.

تیم تحریریه
6
0
09 تیر 1405
لینک کوتاه

تفاوت بین دستورات TRUNCATE و DELETE در SQL Server

در SQL Server برای حذف داده‌ها از جداول معمولاً از دو دستور مهم DELETE و TRUNCATE TABLE استفاده می‌شود.
هر دو دستور وظیفه حذف داده‌ها را بر عهده دارند، اما نحوه عملکرد، سرعت اجرا، میزان ثبت در Transaction Log، تأثیر بر Identity و محدودیت‌های آن‌ها کاملاً متفاوت است.

بسیاری از برنامه‌نویسان و مدیران پایگاه داده در انتخاب بین DELETE و TRUNCATE دچار تردید می‌شوند.
انتخاب نادرست می‌تواند باعث کاهش عملکرد سیستم، مصرف بیش از حد فضای Log یا حتی از دست رفتن اطلاعات شود.
بنابراین آشنایی با تفاوت‌های این دو دستور برای هر فردی که با SQL Server کار می‌کند ضروری است.


تفاوت بین دستورات TRUNCATE و DELETE در 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';

موارد مناسب برای DELETE در SQL Server


موارد مناسب برای 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

جمع‌بندی

دستورات DELETE و TRUNCATE هر دو برای حذف داده‌ها در SQL Server استفاده می‌شوند اما تفاوت‌های مهمی دارند.
DELETE رکوردها را به صورت سطری حذف می‌کند، از WHERE پشتیبانی می‌کند، Triggerها را اجرا می‌کند و مقدار Identity را تغییر نمی‌دهد.
در مقابل، TRUNCATE کل داده‌های جدول را با سرعت بسیار بالا حذف می‌کند، حجم کمی از Transaction Log را مصرف می‌کند و مقدار Identity را به حالت اولیه بازمی‌گرداند.
انتخاب بین این دو دستور باید براساس حجم داده‌ها، نیاز به حذف شرطی، وجود Foreign Key و الزامات عملکردی سیستم انجام شود.

محصولات مرتبط

کاربران ما

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

برای ارسال نظر لطفا ورود یا ثبت نام کنید

منو