我已閱讀,在SQL中刪除和截斷表之間的區別之一是截斷操作不能回滾沒有觸發器將被解僱(as written in this site for example):TRUNCATE TABLE是否增長事務日誌?
問題: 這是否意味着當我包含數百萬條記錄的TRUNCATE TABLE時,我不應該影響事務日誌文件 - 即事務日誌文件不應該在截斷時長大 - 我是否正確?
我已閱讀,在SQL中刪除和截斷表之間的區別之一是截斷操作不能回滾沒有觸發器將被解僱(as written in this site for example):TRUNCATE TABLE是否增長事務日誌?
問題: 這是否意味着當我包含數百萬條記錄的TRUNCATE TABLE時,我不應該影響事務日誌文件 - 即事務日誌文件不應該在截斷時長大 - 我是否正確?
這是否意味着當我包含數百萬條記錄的TRUNCATE TABLE時,我不應該影響事務日誌文件 - 即事務日誌文件不應該在截斷時長大 - 我是否正確?
那麼你沒有指定實際的服務器軟件,但在所有情況下,我知道這是正確的。
DELETE有效地逐行工作,刪除記錄,觸發任何適當的觸發器,並向日志添加事務。
TRUNCATE只是一次性刪除所有的數據,而不是明顯影響事務日誌(當然不足以允許回滾)並且不執行觸發器。
在MS SQL Server(聯機叢書)
相比DELETE語句,TRUNCATE TABLE具有以下優點:使用
較少的事務日誌空間。
DELETE語句一次刪除一行,並在事務日誌中記錄每個刪除行的條目。 TRUNCATE TABLE通過釋放用於存儲表數據的數據頁來刪除數據,並僅在事務日誌中記錄頁解除分配。
通常使用較少的鎖。
當使用行鎖執行DELETE語句時,表中的每一行都被鎖定以供刪除。 TRUNCATE TABLE總是鎖定表(包括模式(SCH-M)鎖)和頁面,但不是每行。
毫無例外地,零頁仍留在表格中。
執行DELETE語句後,表格仍可以包含空白頁面。例如,如果沒有至少一個獨佔(LCK_M_X)表鎖,堆中的空頁將無法解除分配。如果刪除操作不使用表鎖,表(堆)將包含許多空白頁。對於索引,刪除操作可以留下空白頁面,但這些頁面將通過後臺清理過程快速解除分配。
TRUNCATE TABLE刪除表中的所有行,但表結構及其列,約束,索引等依然存在。要除了其數據外還要除去表定義,請使用DROP TABLE語句。
如果該表包含標識列,則該列的計數器將重置爲爲該列定義的種子值。如果未定義種子,則使用默認值1。要保留身份計數器,請改爲使用DELETE。
@D斯坦利 - SQL Server允許回滾的截斷。如果我們使用begin tran - 你能從你的結尾再次嘗試嗎? – Roshan