(1)
delete語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中儲存以便進行進行回滾操作。
truncate table 則一次性地從表中刪除所有的資料並不把單獨的刪除操作記錄記入日誌儲存,刪除行是不能恢復的。並且在刪除的過程中不會啟用與表有關的刪除觸發器。執行速度快。
(2)表和索引所佔空間。
當表被truncate
後,這個表和索引所占用的空間會恢復到初始大小,
delete操作不會減少表或索引所占用的空間。
drop語句將表所占用的空間全釋放掉。
(3)一般而言,
drop > truncate > delete
(4)應用範圍。
truncate 只能對
table
;delete可以是
table
和view
(5)truncate 和
delete
只刪除資料,
drop則刪除整個表(結構和資料)。(6)
truncate
與不帶where
的delete
:只刪除資料,而不刪除表的結構(定義)
drop
語句將刪除表的結構被依賴的約束(
constrain),
觸發器(
trigger)
索引(index);
依賴於該錶的儲存過程
/函式將被保留,但其狀態會變為:
invalid。(7
)delete
語句為dml
(data maintain language),
這個操作會被放到
rollback segment中,
事務提交後才生效。如果有相應的
tigger,
執行的時候將被觸發。(8)
truncate
、drop
是dll
(data define language),
操作立即生效,原資料不放到
rollback segment
中,不能回滾
(9)在沒有備份情況下,謹慎使用
drop
與 truncate
。要刪除部分資料行採用
delete
且注意結合
where
來約束影響範圍。回滾段要足夠大。要刪除錶用
drop;
若想保留表而將表中資料刪除,如果於事務無關,用
truncate
即可實現。如果和事務有關,或老師想觸發
trigger,
還是用delete
。(10
) truncate table
表名 速度快
,而且效率高,因為
:truncate table 在功能上與不帶
where
子句的
delete
語句相同:二者均刪除表中的全部行。但
truncate table
比 delete
速度快,且使用的系統和事務日誌資源少。
delete
語句每次刪除一行,並在事務日誌中為所刪除的每行記錄一項。
truncate table
通過釋放儲存表資料所用的資料頁來刪除資料,並且只在事務日誌中記錄頁的釋放。
(11)
truncate table
刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。如果想保留標識計數值,請改用
delete
。如果要刪除表定義及其資料,請使用
drop table
語句。
(12) 對於由
foreign key
約束引用的表,不能使用
truncate table
,而應使用不帶
where
子句的
delete
語句。由於
truncate table
不記錄在日誌中,所以它不能啟用觸發器。
一、delete
1、delete
是dml
,執行delete
操作時,每次從表中刪除一行,並且同時將該行的的刪除操作記錄在
redo
和undo
表空間中以便進行回滾(
rollback
)和重做操作,但要注意表空間要足夠大,需要手動提交(
commit
)操作才能生效,可以通過
rollback
撤消操作。
2、delete
可根據條件刪除表中滿足條件的資料,如果不指定
where
子句,那麼刪除表中所有記錄。
3、delete
語句不影響表所占用的
extent
,高水線
(high watermark)
保持原位置不變。
二、truncate
1、truncate
是ddl
,會隱式提交,所以,不能回滾,不會觸發觸發器。
2、truncate
會刪除表中所有記錄,並且將重新設定高水線和所有的索引,預設情況下將空間釋放到
minextents
個extent
,除非使用
reuse storage
,。不會記錄日誌,所以執行速度很快,但不能通過
rollback
撤消操作(如果一不小心把乙個表
truncate
掉,也是可以恢復的,只是不能通過
rollback
來恢復)。
3、對於外來鍵(
foreignkey
)約束引用的表,不能使用
truncate table
,而應使用不帶
where
子句的
delete
語句。4、
truncatetable
不能用於參與了索引檢視的表。
三、drop
1、drop
是ddl
,會隱式提交,所以,不能回滾,不會觸發觸發器。
2、drop
語句刪除表結構及所有資料,並將表所占用的空間全部釋放。
3、drop
語句將刪除表的結構所依賴的約束,觸發器,索引,依賴於該錶的儲存過程
/函式將保留
,但是變為
invalid
狀態。
總結:
1、在速度上,一般來說,
drop> truncate > delete
。2、在使用
drop
和truncate
時一定要注意,雖然可以恢復,但為了減少麻煩,還是要慎重。
3、如果想刪除部分資料用
delete
,注意帶上
where
子句,回滾段要足夠大;
如果想刪除表,當然用drop
;如果想保留表而將所有資料刪除,如果和事務無關,用truncate
即可;如果和事務有關,或者想觸發trigger
,還是用
delete
;如果是整理表內部的碎片,可以用truncate
跟上reuse stroage
,再重新匯入
/插入資料。
delete和drop truncate的區別
1.truncate和不帶where子句的delete 以及drop都會刪除表內的資料。2.drop truncate都是ddl語句 資料定義語言 執行後會自動提交。1.truncate 和 delete 只刪除資料不刪除表的結構 定義 drop 語句將刪除表的結構被依賴的約束 constrain ...
drop truncate和delete的區別
delete語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中儲存以便進行進行回滾操作。truncate table 則一次性地從表中刪除所有的資料並不把單獨的刪除操作記錄記入日誌儲存,刪除行是不能恢復的。並且在刪除的過程中不會啟用與表有關的刪除觸發器。執行速度快。...
drop truncate和delete的區別
1 作用上來講 drop語句刪除表結構及所有資料 truncate table 與不帶 where 子句的 delete 語句都是刪除表中的全部行 2 安全性上講 在沒有備份情況下,謹慎使用 drop 與 truncate。要刪除部分資料行採用delete且注意結合where來約束影響範圍。回滾段要...