Oracle High Water Mark

 在Oracle数据的存储中,能够把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫作水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚创建的时候,因为没有任何数据,因此这个时候水位线是空的,也就是说HWM为最低值。当插入了数据之后,高水位线就会上涨,可是这里也有一个特性,就是若是你采用delete语句删除数据的话,数据虽然被删除了,可是高水位线却没有下降,仍是你刚才删除数据之前那么高的水位。也就是说,这条高水位线在平常的增删操做中只会上涨,不会下跌。数据库

 

下面咱们来谈一下Oracle中Select语句的特性。Select语句会对表中的数据进行一次扫描,可是究竟扫描多少数据存储块呢,这个并非说数据库中有多少数据,Oracle就扫描这么大的数据块,而是Oracle会扫描高水位线如下的数据块。如今来想象一下,若是刚才是一张刚刚创建的空表,你进行了一次Select操做,那么因为高水位线HWM在最低的0位置上,因此没有数据块须要被扫描,扫描时间会极短。而若是这个时候你首先插入了一千万条数据,而后再用delete语句删除这一千万条数据。因为插入了一千万条数据,因此这个时候的高水位线就在一千万条数据这里。后来删除这一千万条数据的时候,因为delete语句不影响高水位线,因此高水位线依然在一千万条数据这里。这个时候再一次用select语句进行扫描,虽然这个时候表中没有数据,可是因为扫描是按照高水位线来的,因此须要把一千万条数据的存储空间都要扫描一次,也就是说此次扫描所须要的时间 和扫描一千万条数据所须要的时间是同样多的。因此有时候有人老是常常说,怎么个人表中没有几条数据,可是仍是这么慢呢,这个时候其实奥秘就是这里的高水位线了。ide

 


那有没有办法让高水位线降低呢,其实有一种比较简单的方法,那就是采用TRUNCATE语句进行删除数据。采用TRUNCATE语句删除一个表的数据的时候,相似于从新创建了表,不只把数据都删除了,还把HWM给清空恢复为0。因此若是须要把表清空,在有可能利用TRUNCATE语句来删除数据的时候就利用TRUNCATE语句来删除表,特别是那种数据量有可能很大的临时存储表。spa

 


在手动段空间管理(Manual Segment Space Management)中,段中只有一个HWM,可是在Oracle9iRelease1才添加的自动段空间管理(Automatic Segment Space Management)中,又有了一个低HWM的概念出来。为何有了HWM还又有一个低HWM呢, 这个是由于自动段空间管理的特性形成的。在手段段空间管理中,当数据插入之后,若是是插入到新的数据块中,数据块就会被自动格式化等待数据访问。而在自动段空间管理中,数据插入到新的数据块之后,数据块并无被格式化,而是在第一次在第一次访问这个数据块的时候才格式化这个块。因此咱们又须要一条水位线, 用来标示已经被格式化的块。这条水位线就叫作低HWM。通常来讲,低HWM确定是低于等于HWM的。3d

相关文章
相关标签/搜索