什么是高水位?
首先新建一张空表,大小占用64K,然后插入数据直到表大小变为50G,此时使用DELETE删除所有的数据并且提交,这个时候查询表的大小的时候依然是50G,这就是因为表的高水位没有释放的缘故,而在这时如果使用“SELECT * FROM TABLE_NAME;”语句来查询数据的话,那么查询过程就会很慢,因为Oracle要执行全表扫描,从高水位下所有的块都得去扫描,直到50G的所有块全部扫描完毕。此时就需要释放水位。
1.使用truncate可以释放水位,因为truncate属于ddl操作,相当于重建表。
2.move:需要重建index
ALTER TABLE TABLE_NAME MOVE
3.exp/imp或expdp/impdp重构表。
4.shrink space:
ALTER TABLE TABLE_NAME SHRINK SPACE
使用该命令需要开启行移动(ALTER TABLE TABLE_NAME ENABLE ROW MOVEMENT
),缺点是会产生大量undo,redo。一般情况下收缩表需要重建index,
以下情况无法使用shrink:
IOT mapping tables
Tables with rowid based materialized views
Tables with function-based indexes
SECUREFILE LOBs
Compressed tables
详细参考:https://docs.oracle.com/cd/E11882_01/server.112/e25494/schema.htm#ADMIN10161