HWM, 全称是 High Water Mark(高水位线)。
在了解高水位线之前先了解一下,Oracle数据库的逻辑结构:Tablespace-->segments(段)-->extens(区)-->block(块)
1).Tablespace:包含段、区、块,表空间是实际存在在存储上的一个文件,一个数据库至少要有一个表空间。
2).segments:是由一系列的区所组成的,当创建对象时(table,index)就会分配一个段给这个对象,所以会有数据段,和索引段
查询段的信息可从USER_SEGMENTS来获得。
3).extents:是由一系列的块组成的,区也是Oracle最小的分配单位,当我们创建一个表的时候首先会分配一个区的空间给这
个表,随着表的增长Oracle在会以区进行扩展。而不是以块扩展。
4).block:块是Oracle中最小的粒度单位,每次I/O的最小单位也是块,而不是行。块的默认大小是8K。
在Oracle中的每一个段都会有一个段内所容纳数据的上限,我们把这个上限称为HWM。这个HWM用来标记有段内存放数据所使用的块的最高历史记录。每次HWM的增长幅度是5个块,原则上HWM只会上升,而不会下降,所以HWM就像一个水库的历史的最高水位,即使段内的数据被delete,HWM也不会下降。如果使用truncate命令之后HWM则会置0.
一. HWM对数据库操作的影响如下:
1).在全表扫描的时候Oracle会读出HWM一下的所有数据块,即使数据块上没有数据,这样会增大全表扫描的时间。
2).在向表中插入数据的时候,使用append关键字之后便会在HWM之上插入数据,即使HWM之下有空闲块,此时HWM也会增加。
二.如何查看HWM:
首先对表进行统计信息:
ANALYZE TABLE <tablename> STATISTICS COMPUTE;
从user_tables中获得信息:
SELECT blocks,empty_blocks FROM user_tables
WHERE TABLE_NAME=<tablename>
这里的blocks是段内数据所到的最大上限即HWM,empty_blocks则是HWM上所空闲的块的数量。
三.HWM的信息存储在段头当中。
HWM的本身的信息是存放在段头中的,如果段空间是手工管理方式时,Oracle是通过FREELIST(单项链表)来管理段内的空间
分配的,在段空间是自动管理方式(ASSM)时,Oracle是通过BITMAP来管理段内的空间分配的。