首页 > Linux操作系统 > Linux操作系统 > Oracle表段中高水位线HWM
在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。
那有没有办法让高水位线下降呢,其实有一种比较简单的方法,那就是采用TRUNCATE语句进行删除数据。采用TRUNCATE语句删除一个表的数据的时候,类似于重新建立了表,不仅把数据都删除了,还把HWM给清空恢复为0。所以如果需要把表清空,在有可能利用TRUNCATE语句来删除数据的时候就利用TRUNCATE语句来删除表,特别是那种数据量有可能很大的临时存储表。
如果在执行删除操作后不降低高水位线标记或不回收使用空间,则将导致查询语句的性能低下。下面的方法都可以降低高水位线标记。
1.执行alter table table_name shrink space cascade; 此命令为Oracle10g新增功能,再执行该指令之前必须允许行移动alter table table_name enable row movement;假设表t_lob如下:
SQL> alter table t_lob enable row movement;
Table altered.
SQL> alter table t_lob shrink space cascade;
Table altered.
2.复制要保留的数据到临时表t,drop原表,然后rename临时表t为原表
3.emp/imp
4.alter table table_name deallocate unused;
5.尽量truncate 将会省去很多麻烦。
而如果表中有LOB字段时,也可以做吗?答案是肯定的.可以通过两种方法来做.一种是通过普通的alter table table_name shrink space cascade来做(注意一定要有cascade);第二种是通过alter table table_name modify lob(column) (shrink space)来做,但这样只回收LOB字段使用空间,不回收表的使用空间.只有对表alter table t_lob shrink space 才能回收表空间。可以通过select segment_name,segment_type,bytes/1024,tablespace_name from user_segments;语句查询段LOBSEGMENT和表t_lob的大小变化。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/628922/viewspace-614866/ ,如需转载,请注明出处,否则将追究法律责任。