深入解析delete和truncate不同之處:
深入解析delete和truncate不同之處:
1.delete與trucate都用來刪除表中的資料,那它們有什麼不同之處呢?我先概要的將它們的不同之處說出,然後用測試依次來證實我所說的不同之處。
2.delete是DML操作,需要生undo成資料,在沒有commit前可以回滾。truncate是DDL操作,不需要生成undo資料,也無法回滾。
3.delte操作並不降低水位線hwm,也就是無法釋放被刪除記錄所佔用的塊空間,undo相反,降低hwm,釋放被刪除記錄所佔用的表空間。
4.在對整個表和索引進行完全瀏覽時,經過TRUNCATE操作後的表比DELETE操作後的表要快得多。
5.detele的執行速度要遠遠低於truncate,就像要求你把一本書扔掉,detele操作是一頁一頁撕下來,
而truncate則是把整本書直接扔到垃圾桶,造成它們速度差距的根本原因除了有無undo資料的生成之外,
和它們在塊上的實現操作有關.
6.TRUNCATE不能觸發任何DELETE觸發器
7.不能授予任何人清空他人的表的許可權
8.不能清空父表
2.delete是DML操作,需要生undo成資料,在沒有commit前可以回滾。truncate是DDL操作,不需要生成undo資料,也無法回滾。
3.delte操作並不降低水位線hwm,也就是無法釋放被刪除記錄所佔用的塊空間,undo相反,降低hwm,釋放被刪除記錄所佔用的表空間。
4.在對整個表和索引進行完全瀏覽時,經過TRUNCATE操作後的表比DELETE操作後的表要快得多。
5.detele的執行速度要遠遠低於truncate,就像要求你把一本書扔掉,detele操作是一頁一頁撕下來,
而truncate則是把整本書直接扔到垃圾桶,造成它們速度差距的根本原因除了有無undo資料的生成之外,
和它們在塊上的實現操作有關.
6.TRUNCATE不能觸發任何DELETE觸發器
7.不能授予任何人清空他人的表的許可權
8.不能清空父表
1.=====> 對空間的影響
++++++++++++++++++++++++++++++++++++++++++++
SQL> create table Tmall as select * from dba_objects;
Table created.
SQL> insert into Tmall select * from dba_objects;
75091 rows created.
SQL> /
75091 rows created.
SQL> /
75091 rows created.
SQL> /
75091 rows created.
43
SQL> col SEGMENT_NAME for a10
SQL> select segment_name, bytes/1024/1024 from dba_segments where segment_name='TMALL';
SQL> col SEGMENT_NAME for a10
SQL> select segment_name, bytes/1024/1024 from dba_segments where segment_name='TMALL';
SEGMENT_NA BYTES/1024/1024
---------- ---------------
TMALL 43
---------- ---------------
TMALL 43
SQL> select count(*) from dba_extents where segment_name='TMALL';
COUNT(*)
----------
58
----------
58
============
SQL> delete from TMALL;
SQL> delete from TMALL;
375455 rows deleted.
SQL> commit;
Commit complete.
SQL> select segment_name, bytes/1024/1024 from dba_segments where segment_name='TMALL';
SEGMENT_NA BYTES/1024/1024
---------- ---------------
TMALL 43
---------- ---------------
TMALL 43
SQL> select count(*) from dba_extents where segment_name='TMALL';
COUNT(*)
----------
58
---> delete 掉後,表Tmall所佔用的extent為58個.
----------
58
---> delete 掉後,表Tmall所佔用的extent為58個.
SQL> truncate table TMALL;
Table truncated.
SQL> select segment_name, bytes/1024/1024 from dba_segments where segment_name='TMALL';
SEGMENT_NA BYTES/1024/1024
---------- ---------------
TMALL .0625
---------- ---------------
TMALL .0625
SQL> select count(*) from dba_extents where segment_name='TMALL';
COUNT(*)
----------
1
truncate:
----------
1
truncate:
Truncate後塊只有1.
由實驗可見:delete操作不會釋放空間,而Truncate操作會釋放空間。Delete操作後,刪除的是那個表資料騰出空間還只能被那個表使用並不讓其它表使用.
====> 如何釋放delete後仍佔據的空間
SQL> delete from TMALL;
SQL> delete from TMALL;
375455 rows deleted.
SQL> select count(*) from tmall;
COUNT(*)
----------
0
----------
0
SQL> select count(*) from dba_extents where segment_name='TMALL';
COUNT(*)
----------
58
----------
58
SQL> alter table Tmall move;
Table altered.
SQL> select count(*) from dba_extents where segment_name='TMALL';
COUNT(*)
----------
1
----------
1
====> 比較兩者所產生undo的測試
SQL> create table Tmall as select * from dba_objects;
SQL> create table Tmall as select * from dba_objects;
Table created.
SQL> select used_ublk,used_urec from v$transaction;
no rows selected
SQL> delete from Tmall;
75091 rows deleted.
SQL> select used_ublk,used_urec from v$transaction;
USED_UBLK USED_UREC
---------- ----------
2197 75091
+++++++++++++++++++++++++++++++++++++++++++++++++++
delete 產生了大量的undo
---------- ----------
2197 75091
+++++++++++++++++++++++++++++++++++++++++++++++++++
delete 產生了大量的undo
SQL> create table Tmall as select * from dba_objects;
Table created.
SQL> select used_ublk,used_urec from v$transaction;
no rows selected
SQL> truncate table TMALL;
Table truncated.
SQL> select used_ublk,used_urec from v$transaction;
no rows selected
++++++++++++++++++
truncate 不產生undo.
truncate 不產生undo.
====> 比較兩者所完成的時間
SQL> set timing on
SQL> delete from Tmall;
SQL> set timing on
SQL> delete from Tmall;
375455 rows deleted.
Elapsed: 00:00:13.72
SQL> truncate table Tmall;
Table truncated.
Elapsed: 00:00:00.25
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22578826/viewspace-749694/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 簡述truncate、delete和dropdelete
- truncate和delete 的區別delete
- truncate 和 delete 的效能對比delete
- delete和truncate刪除的區別delete
- Oracle中truncate和delete的區別Oracledelete
- HWM和delete,drop,truncate的關係delete
- Diffrence Between delete and truncatedelete
- truncate 比 delete 慢delete
- drop、delete 與truncatedelete
- SQL – TRUNCATE vs DELETESQLdelete
- [轉][資料庫SQL語句]truncate/delete/drop同與不同資料庫SQLdelete
- SQLSERVER 的 truncate 和 delete 有區別嗎?SQLServerdelete
- MySQL和Oracle中的delete,truncate對比MySqlOracledelete
- truncate delete drop 區別delete
- truncate delete 的區別delete
- Oracle中truncate和delete的區別(例項)Oracledelete
- Truncate,Delete,Drop的比較.delete
- truncate與delete的區別delete
- truncate 比 delete 慢的原因。delete
- 詳解SQL中drop、delete和truncate的異同SQLdelete
- SQL truncate 、delete與drop區別SQLdelete
- oracle truncate 與 delete 的區別Oracledelete
- truncate,delete,drop的異同點delete
- 資料庫關鍵詞 drop、truncate和delete的用法資料庫delete
- truncate和不帶where子句的delete, 以及drop區別delete
- truncate,delete,drop的異同點(原)delete
- 關於delete,drop,truncate的問題delete
- delete table 和 truncate table - 型別安全的心 - 部落格園delete型別
- 資料庫:drop、truncate、delete的區別資料庫delete
- zt_orafaq_delete與truncate的區別delete
- 表管理之四:刪除資料Delete與truncate的使用區別delete
- Python和Java之間有什麼不同之處?PythonJava
- Linux和Unix有什麼不同之處?Linux
- <七>深入理解new和delete的原理delete
- mv complate重新整理時使用DELETE OR TRUNCATE!delete
- mysql資料庫中刪除資料的三種形式 drop和 truncate 和 deleteMySql資料庫delete
- 一文解析:低程式碼與無程式碼的相同之處、不同之處以及如何選?
- oracle恢復表delete/truncate/drop的方法總結Oracledelete