truncate 和 delete 的区别
1、truncate 是清空一张表,相当于delete from table;
2、truncate 是DDL,delete是DML操作;
3、truncate 表数据后,内存中便不存在这些数据了,除非应用特殊手段来恢复,
而delete掉的数据则继续保留在内存中,仅仅是将数据放在了undo表空间,可以通过回滚方式撤销;
4、truncate 后会下调高水位标记(HWM high water mark),而delete不会!
5、truncate 只能对table,而delete可以对table、view、synonym;
6、truncate 的效率比delete高很多!
关于truncate和delete对高水位线的影响实验:
SQL> create table hwm as select * from dba_objects where 1=2;
表已创建。
已用时间: 00: 00: 00.04
SQL> commit;
提交完成。
SQL> analyze table hwm estimate statistics;
表已分析。
已用时间: 00: 00: 00.02
SQL> edit
已写入 file afiedt.buf
1* select segment_name,blocks from dba_segments where segment_name='HWM'
SQL> /
未选定行
SQL> insert into hwm select * from dba_objects;
已创建73364行。
已用时间: 00: 00: 00.77
SQL> commit;
提交完成。
已用时间: 00: 00: 00.00
SQL> analyze table hwm estimate statistics;
表已分析。
已用时间: 00: 00: 00.09
SQL> edit
已写入 file afiedt.buf
1* select segment_name,blocks from dba_segments where segment_name='HWM'
SQL> /
SEGMENT_NAME
--------------------------------------------------------------------------------
BLOCKS
----------
HWM
1152 -----------高水位线为1152
已用时间: 00: 00: 00.02
SQL> edit
已写入 file afiedt.buf
1 select blocks,empty_blocks,num_rows from user_tables
2* where table_name='HWM'
SQL> /
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------- ------------ ----------
1126 26 78064
已用时间: 00: 00: 00.03
SQL> delete from hwm; -----------------删除表数据
已删除73364行。
已用时间: 00: 00: 00.90
SQL> commit;
提交完成。
已用时间: 00: 00: 00.05
SQL> edit
已写入 file afiedt.buf
1* select segment_name,blocks from dba_segments where segment_name='HWM'
SQL> /
SEGMENT_NAME
--------------------------------------------------------------------------------
BLOCKS
----------
HWM
1152 -----------高水位线为1152
已用时间: 00: 00: 00.02
SQL> insert into hwm select * from dba_objects; -------------重新插入数据做实验
已创建73364行。
已用时间: 00: 00: 00.57
SQL> commit;
提交完成。
已用时间: 00: 00: 00.06
SQL> analyze table hwm estimate statistics; -----------分析表
表已分析。
已用时间: 00: 00: 00.05
SQL> edit
已写入 file afiedt.buf
1* select segment_name,blocks from dba_segments where segment_name='HWM'
SQL> /
SEGMENT_NAME
--------------------------------------------------------------------------------
BLOCKS
----------
HWM
1152 -----------高水位线为1152
已用时间: 00: 00: 00.02
SQL> truncate table hwm; ------------用truncate删除
表被截断。
已用时间: 00: 00: 00.97
SQL> commit;
提交完成。
已用时间: 00: 00: 00.00
SQL> analyze table hwm estimate statistics;
表已分析。
已用时间: 00: 00: 00.01
SQL> edit
已写入 file afiedt.buf
1* select segment_name,blocks from dba_segments where segment_name='HWM'
SQL> /
SEGMENT_NAME
--------------------------------------------------------------------------------
BLOCKS
----------
HWM
8 -----------高水位线为8
已用时间: 00: 00: 00.02
SQL>