3 回答

紫衣仙女
TA貢獻1839條經驗 獲得超15個贊
應該注意的是,如果所有數據都是通過DELETE
(即無WHERE
子句)從表中刪除的,那么只要a)權限允許它,并且b)沒有引用該表的FK(似乎是在這種情況下,使用TRUNCATE TABLE
將是優選的,因為它更有效DELETE
?并且同時重置IDENTITY
種子。
與DELETE語句相比,TRUNCATE TABLE具有以下優點:
使用較少的事務日志空間。
DELETE語句一次刪除一行,并在事務日志中為每個已刪除的行記錄一個條目。TRUNCATE TABLE通過釋放用于存儲表數據的數據頁來刪除數據,并僅在事務日志中記錄頁面解除分配。
通常使用較少的鎖。
使用行鎖執行DELETE語句時,表中的每一行都被鎖定以進行刪除。TRUNCATE TABLE總是鎖定表(包括模式(SCH-M)鎖)和頁面,但不是每行。
毫無例外,表格中留有零頁面。
執行DELETE語句后,表仍可以包含空頁。例如,如果沒有至少一個獨占(LCK_M_X)表鎖,則無法釋放堆中的空頁。如果刪除操作不使用表鎖,則表(堆)將包含許多空頁。對于索引,刪除操作可以留下空頁,盡管這些頁面將通過后臺清理過程快速釋放。
如果表包含標識列,則該列的計數器將重置為為該列定義的種子值。如果未定義種子,則使用默認值1。要保留身份計數器,請改用DELETE。
所以以下內容:
DELETE?FROM?[MyTable];DBCC?CHECKIDENT?('[MyTable]',?RESEED,?0);
變得公正:
TRUNCATE?TABLE?[MyTable];
添加回答
舉報
0/150
提交
取消