一、oracle 高水位线详解
一、什么是水线(High Water Mark)?
所有的 oracle 段(segments,在此,为了理解方便,建议把 segment 作为表的一个同义词) 都
有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或 HWM。这个 HWM
是一个标记,用来说明已经有多少没有使用的数据块分配给这个 segment。HWM 通常增长的
幅度为一次5个数据块,原则上 HWM 只会增大,不会缩小,即使将表中的数据全部删除,HWM
还是为原值,由于这个特点,使 HWM 很象一个水库的历史最高水位,这也就是 HWM 的原始含
义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。但是如果我们在表上使
用了 truncate 命令,则该表的 HWM 会被重新置为0。
二、HWM 数据库的操作有如下影响:
a) 全表扫描通常要读出直到 HWM 标记的所有的属于该表数据库块,即使该表中没有任何数
据。
b) 即使 HWM 以下有空闲的数据库块,键入在插入数据时使用了 append 关键字,则在插入时
使用 HWM 以上的数据块,此时 HWM 会自动增大。
三、如何知道一个表的 HWM?
a) 首先对表进行分析:
ANALYZE TABLE <tablename> ESTIMATE/COMPUTE STATISTICS;
b) SELECT blocks, empty_blocks, num_rows
FROM user_tables
WHERE table_name = <tablename>;
说明:
BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。
EMPTY_BLOCKS 代表分配给该表,但是在水线以上的数据库块,即从来没有使用的数据块。
让我们以一个有28672行的 BIG_EMP1表为例进行说明:
1) SQL> SELECT segment_name, segment_type, blocks
FROM dba_segments
WHERE segment_name='BIG_EMP1';
SEGMENT_NAME SEGMENT_TYPE BLOCKS
----------------- -------------- ---------
评论