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
观察到高水位线已经下降。