详解Oracle DELETE和TRUNCATE 的区别
語法
delete from aa?
truncate table aa?
區(qū)別?
1.delete from后面可以寫條件,truncate不可以。
2.delete from記錄是一條條刪的,所刪除的每行記錄都會(huì)進(jìn)日志,而truncate一次性刪掉整個(gè)頁,因此日至里面只記錄頁釋放,簡言之,delete from更新日志,truncate基本不,所用的事務(wù)日志空間較少。
3.delete from刪空表后,會(huì)保留一個(gè)空的頁,truncate在表中不會(huì)留有任何頁。
4.當(dāng)使用行鎖執(zhí)行 DELETE 語句時(shí),將鎖定表中各行以便刪除。truncate始終鎖定表和頁,而不是鎖定各行。?
5.如果有identity產(chǎn)生的自增id列,delete from后仍然從上次的數(shù)開始增加,即種子不變,而truncate后,種子會(huì)恢復(fù)初始。
6.truncate不會(huì)觸發(fā)delete的觸發(fā)器,因?yàn)閠runcate操作不記錄各個(gè)行刪除。
總結(jié)
1.truncate和 delete只刪除數(shù)據(jù)不刪除表的結(jié)構(gòu)(定義)?????
?? drop語句將刪除表的結(jié)構(gòu)被依賴的約束(constrain),觸發(fā)器(trigger),索引(index); 依賴于該表的存儲(chǔ)過程/函數(shù)將保留,但是變?yōu)閕nvalid狀態(tài)。
??
2.delete語句是dml,這個(gè)操作會(huì)放到rollback segement中,事務(wù)提交之后才生效;如果有相應(yīng)的trigger,執(zhí)行的時(shí)候?qū)⒈挥|發(fā)
??? truncate,drop是ddl, 操作立即生效,原數(shù)據(jù)不放到rollback segment中,不能回滾. 操作不觸發(fā)trigger。
??
3.delete語句不影響表所占用的extent, 高水線(high watermark)保持原位置不動(dòng)?????
?? 顯然drop語句將表所占用的空間全部釋放?????
?? truncate 語句缺省情況下見空間釋放到 minextents個(gè) extent,除非使用reuse storage;?? truncate會(huì)將高水線復(fù)位(回到最開始)。
?
4.速度,一般來說: drop> truncate > delete。
?????
5.安全性:小心使用drop 和truncate,尤其沒有備份的時(shí)候.否則哭都來不及。
6.使用上,想刪除部分?jǐn)?shù)據(jù)行用delete,注意帶上where子句. 回滾段要足夠大.???? 想刪除表,當(dāng)然用drop?????
想保留表而將所有數(shù)據(jù)刪除. 如果和事務(wù)無關(guān),用truncate即可. 如果和事務(wù)有關(guān),或者想觸發(fā)trigger,還是用delete
如果是整理表內(nèi)部的碎片,可以用truncate跟上reuse stroage,再重新導(dǎo)入/插入數(shù)據(jù)。
轉(zhuǎn)載地址:http://www.cnblogs.com/simplefrog/archive/2012/07/30/2615169.html
----------------------------------------------------------------------------------------
truncate,delete區(qū)別
truncate table命令將快速刪除數(shù)據(jù)表中的任何記錄,但保留數(shù)據(jù)表結(jié)構(gòu)。這種快速刪除和delete from 數(shù)據(jù)表的刪除全部數(shù)據(jù)表記錄不相同,delete命令刪除的數(shù)據(jù)將存儲(chǔ)在系統(tǒng)回滾段中,需要的時(shí)候,數(shù)據(jù)能夠回滾恢復(fù),而truncate命令刪除的數(shù)據(jù)是不能夠恢復(fù)的。
truncate操作 同沒有where條件的delete操作十分相似
1、無論truncate大表還是小表速度都非???。delete要產(chǎn)生回滾信息來滿足回滾需求,而truncate是不產(chǎn)生的。
2、truncate是DDL語句進(jìn)行隱式提交,不能進(jìn)行回滾操作
3、truncate重新設(shè)定表和索引的HWM(高水標(biāo)記),由于全表掃描和索引快速掃描都要讀取所有的數(shù)據(jù)塊知道HWM為止,所以全表掃描的性能不會(huì)因?yàn)閐elete而提高,但是經(jīng)過truncate操作后速度會(huì)很快
4、truncate不觸發(fā)任何delete觸發(fā)器
5、不能賦給某個(gè)用戶truncate其它用戶表的權(quán)限。如果需要trucate其它用戶表的權(quán)限必須對(duì)該用戶賦DROP ANY TABLE權(quán)限
6、當(dāng)表被truncate后,這個(gè)表和索引所占用的空間會(huì)恢復(fù)到初始大小,而delete操作不會(huì)減少表或索引所占用的空間。
7、不能truncate一個(gè)帶有外鍵的表,如果要?jiǎng)h除首先要取消外鍵,然后再刪除。
?
truncate與delete的區(qū)別
truncate table命令將快速刪除數(shù)據(jù)表中的所有記錄,但保留數(shù)據(jù)表結(jié)構(gòu)。這種快速刪除與delete from 數(shù)據(jù)表的刪除全部數(shù)據(jù)表記錄不一樣,delete命令刪除的數(shù)據(jù)將存儲(chǔ)在系統(tǒng)回滾段中,需要的時(shí)候,數(shù)據(jù)可以回滾恢復(fù),而truncate命令刪除的數(shù)據(jù)是不可以恢復(fù)的
可以做一個(gè)測試
建一個(gè)帶有自增字段的表,加入100萬數(shù)據(jù)
然后分別用TRUNCATE和DELETE刪除全部數(shù)據(jù)
然后再向表里插入一條數(shù)據(jù)
最直觀是:
1.TRUNCATE TABLE是非??斓?br />2.TRUNCATE之后的自增字段從頭開始計(jì)數(shù)了,而DELETE的仍保留原來的最大數(shù)值
………………………………………………………………………………………………
注意:這里說的delete是指不帶where子句的delete語句
相同點(diǎn)
truncate和不帶where子句的delete, 以及drop都會(huì)刪除表內(nèi)的數(shù)據(jù)
不同點(diǎn):
1. truncate和 delete只刪除數(shù)據(jù)不刪除表的結(jié)構(gòu)(定義)
????drop語句將刪除表的結(jié)構(gòu)被依賴的約束(constrain),觸發(fā)器(trigger),索引(index); 依賴于該表的存儲(chǔ)過程/函數(shù)將保留,但是變?yōu)閕nvalid狀態(tài).
2.delete語句是dml,這個(gè)操作會(huì)放到rollback segement中,事務(wù)提交之后才生效;如果有相應(yīng)的trigger,執(zhí)行的時(shí)候?qū)⒈挥|發(fā).
???truncate,drop是ddl, 操作立即生效,原數(shù)據(jù)不放到rollback segment中,不能回滾. 操作不觸發(fā)trigger.
3.delete語句不影響表所占用的extent, 高水線(high watermark)保持原位置不動(dòng)
??顯然drop語句將表所占用的空間全部釋放
??truncate 語句缺省情況下見空間釋放到 minextents個(gè) extent,除非使用reuse storage;???truncate會(huì)將高水線復(fù)位(回到最開始).
4.速度,一般來說: drop>; truncate >; delete
5.安全性:小心使用drop 和truncate,尤其沒有備份的時(shí)候.否則哭都來不及
使用上,想刪除部分?jǐn)?shù)據(jù)行用delete,注意帶上where子句. 回滾段要足夠大.
想刪除表,當(dāng)然用drop
想保留表而將所有數(shù)據(jù)刪除. 如果和事務(wù)無關(guān),用truncate即可. 如果和事務(wù)有關(guān),或者想觸發(fā)trigger,還是用delete.
如果是整理表內(nèi)部的碎片,可以用truncate跟上reuse stroage,再重新導(dǎo)入/插入數(shù)據(jù)
語句實(shí)例:
truncate table wap_cms_cp_user
?
數(shù)據(jù)刪除 delete、drop、truncate
相同點(diǎn):
truncate和不帶where子句的delete, 以及drop都會(huì)刪除表內(nèi)的數(shù)據(jù)?
不同點(diǎn):?
1. truncate和 delete只刪除數(shù)據(jù)不刪除表的結(jié)構(gòu)(定義)?
????drop語句將刪除表的結(jié)構(gòu)被依賴的約束(constrain),觸發(fā)器(trigger),索引(index); 依賴于該表的存儲(chǔ)過程/函數(shù)將保留,但是變?yōu)閕nvalid狀態(tài).?
2.delete語句是dml,這個(gè)操作會(huì)放到rollback segement中,事務(wù)提交之后才生效;如果有相應(yīng)的trigger,執(zhí)行的時(shí)候?qū)⒈挥|發(fā).?
???truncate,drop是ddl, 操作立即生效,原數(shù)據(jù)不放到rollback segment中,不能回滾. 操作不觸發(fā)trigger.?
3.delete語句不影響表所占用的extent, 高水線(high watermark)保持原位置不動(dòng)?
??顯然drop語句將表所占用的空間全部釋放?
??truncate 語句缺省情況下見空間釋放到 minextents個(gè) extent,除非使用reuse storage;???truncate會(huì)將高水線復(fù)位(回到最開始).?
4.速度,一般來說: drop>; truncate >; delete
5.安全性:小心使用drop 和truncate,尤其沒有備份的時(shí)候.
使用上,想刪除部分?jǐn)?shù)據(jù)行用delete,注意帶上where子句. 回滾段要足夠大.?
想刪除表,當(dāng)然用drop?
想保留表而將所有數(shù)據(jù)刪除. 如果和事務(wù)無關(guān),用truncate即可. 如果和事務(wù)有關(guān),或者想觸發(fā)trigger,還是用delete.?
如果是整理表內(nèi)部的碎片,可以用truncate跟上reuse stroage,再重新導(dǎo)入/插入數(shù)據(jù)
6.使用方法:drop table tablename,delete from tablename,truncate table tablename
總結(jié):
1、delete和truncate只刪除表中數(shù)據(jù),而drop刪除表
2、速度上drop>; truncate >; delete
3、drop和truncate無備份,delete有備份可回滾
?
關(guān)于oracle使用delete刪除的問題
問題:
在oracle里,使用delete刪除數(shù)據(jù)以后,數(shù)據(jù)庫的存儲(chǔ)容量不會(huì)減少,而且使用delete刪除某個(gè)表的數(shù)據(jù)以后,查詢這張表的速度和刪除之前一樣,不會(huì)發(fā)生變化。
原因:
因?yàn)閛ralce有一個(gè)HWM高水位,它是oracle的一個(gè)表使用空間最高水位線。當(dāng)插入了數(shù)據(jù)以后,高水位線就會(huì)上漲,但是如果你采用delete語句刪除數(shù)據(jù)的話,數(shù)據(jù)雖然被刪除了,但是高水位線卻沒有降低,還是你剛才刪除數(shù)據(jù)以前那么高的水位。除非使用truncate刪除數(shù)據(jù)。那么,這條高水位線在日常的增刪操作中只會(huì)上漲,不會(huì)下跌,所以數(shù)據(jù)庫容量也只會(huì)上升,不會(huì)下降。而使用select語句查詢數(shù)據(jù)時(shí),數(shù)據(jù)庫會(huì)掃描高水位線以下的數(shù)據(jù)塊,因?yàn)楦咚痪€沒有變化,所以掃描的時(shí)間不會(huì)減少,所以才會(huì)出現(xiàn)使用delete刪除數(shù)據(jù)以后,查詢的速度還是和delete以前一樣。
?
解決方案:
1.首先導(dǎo)出表,然后truncate這張表,最后導(dǎo)入這張表。
2.在存儲(chǔ)空間當(dāng)中移動(dòng)表,但是由于rowid會(huì)被打亂,所以需要重建索引.
3.如果是oracle 10g.可以直接更新表的高水位線。
對(duì)應(yīng)的SQL:
9i中:
create table aa_bak as select * from aa where record_time > sysdate - 10;
truncate table aa;
insert into aa select * from aa_bak;
drop table aa_bak;
10g 版本
alter tablename enable row movement;
alter tablename shrink space;
?注意:這里說的delete是指不帶where子句的delete語句
相同點(diǎn):truncate和不帶where子句的delete, 以及drop都會(huì)刪除表內(nèi)的數(shù)據(jù)
不同點(diǎn):
1. truncate和 delete只刪除數(shù)據(jù)不刪除表的結(jié)構(gòu)(定義)
?????drop語句將刪除表的結(jié)構(gòu)被依賴的約束(constrain),觸發(fā)器(trigger),索引(index); 依賴于該表的存儲(chǔ)過程/函數(shù)將保留,但是變?yōu)閕nvalid狀態(tài).
2.delete語句是DML,這個(gè)操作會(huì)放到rollback segement中,事務(wù)提交之后才生效;如果有相應(yīng)的trigger,執(zhí)行的時(shí)候?qū)⒈挥|發(fā).
????truncate,drop是DDL, 操作立即生效,原數(shù)據(jù)不放到rollback segment中,不能回滾. 操作不觸發(fā)trigger.
3.delete語句不影響表所占用的extent, 高水線(high watermark)保持原位置不動(dòng)
???顯然drop語句將表所占用的空間全部釋放
???truncate 語句缺省情況下見空間釋放到 minextents個(gè) extent,除非使用reuse storage;???truncate會(huì)將高水線復(fù)位(回到最開始).
4.速度,一般來說: drop> truncate > delete
5.安全性:小心使用drop 和truncate,尤其沒有備份的時(shí)候.否則哭都來不及
使用上,想刪除部分?jǐn)?shù)據(jù)行用delete,注意帶上where子句. 回滾段要足夠大.
想刪除表,當(dāng)然用drop
想保留表而將所有數(shù)據(jù)刪除. 如果和事務(wù)無關(guān),用truncate即可. 如果和事務(wù)有關(guān),或者想觸發(fā)trigger,還是用delete.
如果是整理表內(nèi)部的碎片,可以用truncate跟上reuse stroage,再重新導(dǎo)入/插入數(shù)據(jù)
6:delete是DML語句,不會(huì)自動(dòng)提交。
drop,truncate都是DDL語句,執(zhí)行后會(huì)自動(dòng)提交
?
7:truncate 只能對(duì)TABLE
delete 可以是table,view,synonym
8:TRUNCATE TABLE 的對(duì)象必須是本模式下的,或者有drop any table的權(quán)限, 而DELETE 則是對(duì)象必須是本模式下的,或被授予 DELETE ON SCHEMA.TABLE 或DELETE ANY TABLE的權(quán)限 。
?
# delete/truncate 只刪除數(shù)據(jù)不刪除表,索引的結(jié)構(gòu)。
drop 將刪除表的結(jié)構(gòu)被依賴的 index/constrain/trigger,依賴于該表的 procedure/function 將保留,但是變?yōu)?invalid 狀態(tài)。
#
delete 是 dml,寫 rollback segement,可回滾,速度慢,事務(wù)提交之后才生效。在 9i 滿足 undo_retention 條件下可使用 flashback。一次性大批量數(shù)據(jù)的 delete 可能導(dǎo)致回滾段急劇擴(kuò)展從而影響到數(shù)據(jù)庫,慎用。觸發(fā) trigger。
truncate/drop 是 ddl,隱式提交,不寫 rollback segment,不能回滾,速度快。9i 不能使用 flashback。不觸發(fā) trigger。
#
delete 不影響表所占用的 extent,HWM 保持原位置不動(dòng),即使刪除的是最靠近 HWM 的數(shù)據(jù)。delete 其實(shí)也可以釋放空間,但是不降低 HWM,delete 后 block 的空閑空間達(dá)到 pct_used,就可以重用。
truncate 缺省情況下將空間(表和索引)釋放到 minextents 個(gè) extent,除非使用 reuse storage。truncate 會(huì)將高水線復(fù)位(回到最開始)。
drop 將表所占用的空間全部釋放,segment 不存在,無所謂 HWM 的概念。
#
truncate/drop 的對(duì)象必須是本模式下的,或者被授予 drop any table 的權(quán)限,但 drop any table 權(quán)限不能 truncate/drop sys 的表。
delete 的對(duì)象必須是本模式下的,或者被授予 delete on SCHEMA.table 或 delete any table 的權(quán)限,但 delete any table 權(quán)限不能 delete sys 的表
轉(zhuǎn)載地址:http://blog.sina.com.cn/s/blog_9d4799c70101625z.html
轉(zhuǎn)載于:https://blog.51cto.com/yangwen7986/1683233
總結(jié)
以上是生活随笔為你收集整理的详解Oracle DELETE和TRUNCATE 的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode:Largest Num
- 下一篇: Nutch 是一个开源Java 实现的搜