ORACLE 高水位线(HWM)

ORACLE 高水位线(HWM)

偶有兴趣,做了个关于高水位线的简单实验。

1、创建一张空表
SYS@PROD1>create table t1 as select * from hr.employees where 1=2;

Table created.

2、查看表空间
SYS@PROD1>select segment_name,segment_type,blocks,extents from dba_segments where segment_name='T1';


SEGMENT_NAME         SEGMENT_TYPE             BLOCKS    EXTENTS
-------------------- -------------------- ---------- ----------
T1                   TABLE                         8          1
因为SYS用户下不支持延迟段创建的功能,所以这里能够查看到已经分配的区和块大小。

3、分析表
SYS@PROD1>analyze table t1 estimate statistics;
analyze table t1 estimate statistics;

Table analyzed.

4、查询块的使用情况
SYS@PROD1>select blocks,empty_blocks,num_rows from dba_tables where table_name='T1';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         0            7          0


blocks -- 高水位线(占用TEST3表数据块数)
empty_blocks -- TEST3表空闲块数
因为未向t1表中插入任何数据,因此此表的高水位线为0,现向TEST3表中插入数据再观察

5、向表中插入数据
SYS@PROD1>insert into t1 select * from hr.employees ;
insert into t1 select * from hr.employees ;

107 rows created.

SYS@PROD1>commit;

Commit complete.

6、重新分析表
SYS@PROD1>analyze table t1 estimate statistics;

Table analyzed.

7、查询分配的区和块大小
SYS@PROD1>select segment_name,segment_type,blocks,extents from dba_segments where segment_name='T1';

SEGMENT_NAME         SEGMENT_TYPE             BLOCKS    EXTENTS
-------------------- -------------------- ---------- ----------
T1                   TABLE                         8          1


SYS@PROD1>select blocks,empty_blocks,num_rows from user_tables where table_name='T1';


    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         2            5        107

8、删除表中数据
SYS@PROD1>delete from t1;

107 rows deleted.

SYS@PROD1>commit;

Commit complete.

9、再次分析表
SYS@PROD1>analyze table t1 estimate statistics ;

Table analyzed.


发现此表高水位线并未减少,证明delete只是删除表中数据块的记录,但并不会使表中的高水位线下降, 在进行全表扫描时会Oracle会扫描表中高水位线下的所有数据块,
因此数据虽然被删除了,但查询时有可能还是很慢。所以在进行大表删除时应使用

SYS@PROD1>select blocks,empty_blocks,num_rows from dba_tables where table_name='T1';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         2            5          0

10、初始化表
SYS@PROD1>truncate table t1;

Table truncated.

由于我是在SYS用户下进行的实验,而system表空间是manual,无法进行shrink,所以就选择了truncate来降低高水位线。

11、分析表
SYS@PROD1>analyze table t1 estimate statistics;
analyze table t1 estimate statistics;

Table analyzed.

12、查看表空间使用情况,来判断高水位线是否下降
SYS@PROD1>select blocks,empty_blocks,num_rows from dba_tables where table_name='T1';
select blocks,empty_blocks,num_rows from dba_tables where table_name='T1';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         0            7          0

观察到高水位线已经下降。


请使用浏览器的分享功能分享到微信等