全表扫描与高水位线
决定是否使用全表扫描的要素:
- 访问的数据块个数
- 最终结果集行数
- 舍弃的行数
全表扫描通常要读出直到HWM标记的所有的属于该表数据块,即使该表中没有任何数据。
HWM(高水位线):用来界定一个段中使用的块和未使用的块。在我们插入数据时,HWM逐渐上移,在HWM之下的,表示使用过的块,HWM之上的就表示未使用过的块。
delete操作不会降低HWM,关于insert语句,如果使用了append选项,HWM会直接上移,数据不会插入到表的空闲块中。
所以,一张原本有大量数据的表,用delete清除一部分数据后,用select来查询,即使现在的表中数据量并不是很多,也可能会有效率问题。
如何处理?
- 最简单的方法:使用truncate语句,不仅清除了表数据,同时也初始化了HWM。一般大表都会做分区,truncate分区即可。
- 复制要保留的数据到临时表,drop原表,然后rename临时表
- emp/imp
- 表重建指令 alter table …move
- alter table…shrink space