標籤:
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.
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.
3.1.1.2 理解
在Oracle資料的儲存中,可以把儲存空間想象為一個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在Oracle中,這條線被稱為高水位線(High-warter mark, HWM)。在資料庫表剛建立的時候,由於沒有任何資料,所以這個時候水位線是空的,也就是說HWM為最低值。當插入了資料以後,高水位線就會上漲,但是這裡也有一個特性,就是如果你採用delete語句刪除資料的話,資料雖然被刪除了,但是高水位線卻沒有降低,還是你剛才刪除資料以前那麼高的水位。也就是說,這條高水位線在日常的增刪操作中只會上漲,不會下跌。
下面我們來談一下Oracle中Select語句的特性。Select語句會對錶中的資料進行一次掃描,但是究竟掃描多少資料存放區塊呢,這個並不是說資料庫中有多少資料,Oracle就掃描這麼大的資料區塊,而是Oracle會掃描高水位線以下的資料區塊。現在來想象一下,如果剛才是一張剛剛建立的空表,你進行了一次Select操作,那麼由於高水位線HWM在最低的0位置上,所以沒有資料區塊需要被掃描,掃描時間會極短。而如果這個時候你首先插入了一千萬條資料,然後再用delete語句刪除這一千萬條資料。由於插入了一千萬條資料,所以這個時候的高水位線就在一千萬條資料這裡。後來刪除這一千萬條資料的時候,由於delete語句不影響高水位線,所以高水位線依然在一千萬條資料這裡。這個時候再一次用select語句進行掃描,雖然這個時候表中沒有資料,但是由於掃描是按照高水位線來的,所以需要把一千萬條資料的儲存空間都要掃描一次,也就是說這次掃描所需要的時間和掃描一千萬條資料所需要的時間是一樣多的。所以有時候有人總是經常說,怎麼我的表中沒有幾條資料,但是還是這麼慢呢,這個時候其實奧秘就是這裡的高水位線了。
那有沒有辦法讓高水位線下降呢,其實有一種比較簡單的方法,那就是採用TRUNCATE語句進行刪除資料。採用TRUNCATE語句刪除一個表的資料的時候,類似於重建立立了表,不僅把資料都刪除了,還把HWM給清空恢複為0。所以如果需要把表清空,在有可能利用TRUNCATE語句來刪除資料的時候就利用TRUNCATE語句來刪除表,特別是那種資料量有可能很大的臨時儲存表。
在手動段空間管理(Manual Segment Space Management)中,段中只有一個HWM,但是在Oracle9iRelease1才添加的自動段空間管理(Automatic Segment Space Management)中,又有了一個低HWM的概念出來。為什麼有了HWM還又有一個低HWM呢,這個是因為自動段空間管理的特性造成的。在手段段空間管理中,當資料插入以後,如果是插入到新的資料區塊中,資料區塊就會被自動格式化等待資料訪問。而在自動段空間管理中,資料插入到新的資料區塊以後,資料區塊並沒有被格式化,而是在第一次在第一次訪問這個資料區塊的時候才格式化這個塊。所以我們又需要一條水位線,用來標示已經被格式化的塊。這條水位線就叫做低HWM。一般來說,低HWM肯定是低於等於HWM的。
3.1.1.3 影響
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(*)---------- 19SQL> 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 19SQL> 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 19SQL> 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 19SQL> analyze table emp3 estimate statistics;Table analyzed.#使用Truncate表可以降低HWMSQL> 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 19SQL> 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 19SQL> alter table emp3 shrink space;alter table emp3 shrink space*ERROR at line 1:ORA-10636: ROW MOVEMENT is not enabledSQL> 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
Oracle 基本篇 --- HWM