Oracle 基本篇 --- HWM

3.1.1 HWM (High Water Mark)

3.1.1.1 定义

To manage space, Oracle Database tracks the state of blocks in the segment. The high water mark (HWM) is the point in a segment beyond which data blocks are unformatted and have never been used.数据库

  • Above the HWM These blocks are unformatted and have never been used.

  • Below the HWM
  • Allocated, but currently unformatted and unused
  • Formatted and contain data
  • Formatted and empty because the data was deleted

The low high water mark (low HWM) marks the point below which all blocks are known to be formatted because they either contain data or formerly contained data.app

此处输入图片的描述

the database chooses a block between the HWM and low HWM and writes to it. The database could have just as easily chosen any other block between the HWM and low HWM, or any block below the low HWM that had available space.spa

此处输入图片的描述


3.1.1.2 理解

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

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

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

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


3.1.1.3 影响
  • 全表扫描一般要读出直到HWM标记的全部的属于该表数据库块,即便该表中没有任何数据。
  • 即便HWM如下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。

3.1.1.4 实践
####################Truncate 下降HWM###########################
#分析表emp3		  
SQL> analyze table emp3 estimate statistics;

Table analyzed.		  

#查看高水位线为blocks=5
#BLOCKS 列表明该表中曾经使用过得数据库块的数目,即水线, 
#USER_TABLES.BLOCKS表示已经使用过的数据库块的数目。
#EMPTY_BLOCKS 表明分配给该表,可是在水线以上的数据库块,即历来没有使用的数据块。
SQL> select blocks, empty_blocks, num_rows from user_tables where table_name = 'EMP3';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         5            3         19

#查看该段分配的块大小,blocks=8	
#DBA_SEGMENTS.BLOCKS表示分配给这个表的全部的数据库块的数目	 
SQL> select segment_name, segment_type, segment_subtype, blocks 
from dba_segments 
where segment_name = 'EMP3';

SEGMENT_NAME    SEGMENT_TYPE       SEGMENT_SU     BLOCKS
--------------- ------------------ ---------- ----------
EMP3            TABLE              ASSM                8
		  
SQL> select count(*) from emp3;

  COUNT(*)
----------
        19

SQL> delete from emp3;

19 rows deleted.

SQL> commit;

Commit complete.

SQL> select blocks, empty_blocks, num_rows from user_tables where table_name = 'EMP3';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         5            3         19

SQL> delete from emp3;

19 rows deleted.

SQL> commit;

Commit complete.

#delete 数据后没法把HWM下降
SQL> select blocks, empty_blocks, num_rows from user_tables where table_name = 'EMP3';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         5            3         19

SQL> truncate table emp3;

Table truncated.

SQL> select blocks, empty_blocks, num_rows from user_tables where table_name = 'EMP3';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         5            3         19

SQL> analyze table emp3 estimate statistics;

Table analyzed.

#使用Truncate表能够下降HWM
SQL> select blocks, empty_blocks, num_rows from user_tables where table_name = 'EMP3';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         0            8          0
         

####################Shrink space 下降HWM###########################
SQL> select blocks, empty_blocks, num_rows from user_tables where table_name = 'EMP3';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         5            3         19

SQL> delete from emp3 where dep_id = 2;

11 rows deleted.

SQL> commit;

Commit complete.

SQL> select blocks, empty_blocks, num_rows from user_tables where table_name = 'EMP3';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         5            3         19

SQL> alter table emp3 shrink space;
alter table emp3 shrink space
*
ERROR at line 1:
ORA-10636: ROW MOVEMENT is not enabled


SQL> alter table emp3 enable row movement;

Table altered.

SQL> alter table emp3 shrink space;

Table altered.

SQL> analyze table emp3 estimate statistics;

Table analyzed.

SQL> select blocks, empty_blocks, num_rows from user_tables where table_name = 'EMP3';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         1            7          8
相关文章
相关标签/搜索