操做
|
回滾
|
高水線
|
空間
|
效率
|
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秒.