ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle表段中高水位线HWM

Oracle表段中高水位线HWM

原创 Linux操作系统 作者:lwitpub 时间:2009-09-17 09:23:39 0 删除 编辑

在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博客 ” ,链接:http://blog.itpub.net/628922/viewspace-614866/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-05-08

  • 博文量
    107
  • 访问量
    381213