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
相關文章
相關標籤/搜索