oracle需要实验,对问题也理解的比较透彻
高水标记:曾经包含数据的最右边的块。
概念最关键的是曾经:数据插入时,高数标记会升高;但数据被删除时,有很多块可能不包含数据,但是仍然在高水标记以下。
全扫描期间,oracle将扫描高水标记以下所有的块,即使它们不包含数据。
SQL> set timing on;
SQL> select count(*) from test1;
COUNT(*)
----------
1023840
已用时间: 00: 00: 02.01
全表扫描102万的数据用时2秒
SQL> delete from test1;
已删除1023840行。
已用时间: 00: 00: 51.00
删除102万的数据
SQL> select count(*) from test1;
COUNT(*)
----------
0
已用时间: 00: 00: 02.00
全表扫描0条的数据用时还是2秒,并没有减少
SQL> truncate table test1;
表已截掉。
已用时间: 00: 00: 00.01
truncate表
SQL> select count(*) from test1;
COUNT(*)
----------
0
已用时间: 00: 00: 00.00
再次全表扫描,用时为0
结论:如果计划删除表中的每一行,用truncate方法是比较好的
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22111412/viewspace-610701/ ,如需转载,请注明出处,否则将追究法律责任。