首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server TRUNCATE vs DELETE 深度解析:觸發器、日誌、效能實測

     編輯:關於SqlServer

核心差異速查表

特性DELETETRUNCATE
觸發器啟動 AFTER DELETE 觸發器不啟動 任何觸發器
日誌記錄逐列記錄(可回滾)僅記錄頁釋放(最小日誌)
身分識別種子保留重置為種子值
外鍵限制受參考完整性約束若被參考則不可用
速度較慢(大量資料)極快(元資料操作)
可回滾是是(在交易中)

實測環境建立

-- 父表
CREATE TABLE Table1 (ID INT NOT NULL, FOID INT NOT NULL);
INSERT INTO Table1 VALUES (1,101),(2,102),(3,103),(4,104);

-- 子表
CREATE TABLE Table2 (FOID INT NOT NULL);
INSERT INTO Table2 VALUES (101),(102),(103),(104);

-- 觸發器:刪除父表同步刪除子表
CREATE TRIGGER TG_Table1 ON Table1 AFTER DELETE
AS
DELETE TA FROM Table2 TA JOIN deleted TB ON TA.FOID = TB.FOID;

測試 1:DELETE 啟動觸發器

DELETE FROM Table1 WHERE ID = 1;
SELECT * FROM Table1;  -- 剩 2,3,4
SELECT * FROM Table2;  -- 101 被級聯刪除

DELETE 觸發器生效

測試 2:TRUNCATE 不啟動觸發器

TRUNCATE TABLE Table1;
SELECT * FROM Table1;  -- 空
SELECT * FROM Table2;  -- 101,102,103,104 全保留!

TRUNCATE 觸發器失效

日誌內容對比

CHECKPOINT;
DELETE FROM Table2 WHERE FOID = 102;
SELECT * FROM fn_dblog(NULL,NULL) WHERE Operation = 'LOP_DELETE_ROWS';

DELETE 日誌

CHECKPOINT;
TRUNCATE TABLE Table2;
SELECT * FROM fn_dblog(NULL,NULL) WHERE Operation = 'LOP_DELETE_ROWS';

TRUNCATE 日誌

觀察:TRUNCATE 無 LOP_DELETE_ROWS 記錄,僅有頁釋放操作(LOP_DEALLOC_EXTENT 等),故不觸發觸發器。

決策指南

  • 需觸發器維護關聯資料、稽核軌跡 → DELETE。
  • 清空整表、重置身分識別、無外鍵被參考、追求極致速度 → TRUNCATE。
  • 大量刪除但需保留部分資料 → 考慮 DELETE 分批 + 索引,或 SWITCH PARTITION(Enterprise 版)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved