操做
|
回滚
|
高水线
|
空间
|
效率
|
Truncate
|
不能
|
降低
|
回收
|
快
|
delete
|
能够
|
不变
|
不回收
|
慢
|
SQL> create table t 2 ( 3 i number 4 ); Table created. SQL> insert into t values(10); SQL> commit; Commit complete. SQL> select * from t; I ---------- 10
Delete删除,而后回滚html
SQL> delete from t; 1 row deleted. SQL> select * from t; no rows selected # 删 除 后回 滚 SQL> rollback; Rollback complete. SQL> select * from t; I ---------- 10
Truncate截断表,而后回滚.linux
SQL> truncate table t; Table truncated. SQL> rollback; Rollback complete. SQL> select * from t; no rows selected
SQL> analyze table t estimate statistics; Table analyzed. SQL> select segment_name,blocks from dba_segments where segment_name=upper('t'); SEGMENT_NAME BLOCKS ------------------------------ ---------- T 24 SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t'); TABLE_NAME BLOCKS EMPTY_BLOCKS ------------------------------ ---------- ------------ T 20 3
USER_TABLES.BLOCKS 列表明该表中曾经使用过得数据库块的数目,即水线。sql
SQL> delete from t; 10000 rows deleted SQL> commit; Commit complete. SQL> analyze table t estimate statistics; Table analyzed. SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t'); TABLE_NAME BLOCKS EMPTY_BLOCKS ------------------------------ ---------- ---------------------------------------------------------------- T 20 3
Truncate截断表
SQL> truncate table t; Table truncated. SQL> analyze table t estimate statistics; Table analyzed. SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t'); TABLE_NAME BLOCKS EMPTY_BLOCKS ------------------------------ ---------- -------------------------------------------------------- T 7
可见,delete表,BLOCK(高水线)不变,而truncate表BLOCKS(高水线)变为
SQL> set timing on; SQL> begin 2 for i in 1..100000 loop 3 insert into t values('10'); 4 commit; 5 end loop; 6 end; 7 / PL/SQL procedure successfully completed. Elapsed: 00:01:12.50
Delete删除表
SQL> delete from t; 100000 rows deleted. Elapsed: 00:00:20.09
Truncate 截断表
# 先把表回滚 SQL> rollback; Rollback complete. Elapsed: 00:00:17.36 SQL> select count(*) from t; COUNT(*) ------------------- 100000 Elapsed: 00:00:00.01 SQL> truncate table t; Table truncated. Elapsed: 00:00:00.20
可见删除同一个大小的表,delete用了20.09秒,而truncate只用了0.2秒.