oracle的高水位線 HWM

2021-09-02 03:53:02 字數 2725 閱讀 4773

hwm的一些特性

1 oracle用hwm來界定乙個段中使用的塊和未使用的塊。

當我們建立乙個表:a時,oracle就會為這個物件分配乙個段.在這個段中,即使我們未插入任何記錄,也至少有乙個區(64bit,也就是8個塊)被分配,第乙個區的第乙個塊就稱為段頭(segment heade),段頭中就儲存了一些資訊,基中hwm的資訊就儲存在此.此時,因為第乙個區的第一塊用於儲存段頭的一些資訊,雖然沒有儲存任何實際的記錄,但也算是被使用,此時hwm是位於第2個塊.當我們不斷插入資料到a後,第1個塊已經放不下後面新插入的資料,此時,oracle將高水位之上的塊用於儲存新增資料,同時,hwm本身也向上移.也就是說,當我們不斷插入資料時,hwm會不斷上移,這樣,在hwm之下的,就表示使用過的塊,hwm之上的就表示已分配但從未使用過的塊.

2 hwm在插入資料時,當現有空間不足而進行空間的擴充套件時會向上移,但刪除資料時不會往下移.

這就好比是水庫的水位,當漲水時,水位往上移,當水退出後,最高水位的痕跡還是清淅可見.

刪除資料後便存在浪費的空間,oracle 不會釋放空間以供其他物件使用,有一條簡單的理由:由於空間是為新插入的行保留的,並且要適應現有行的增長。被占用的最高空間稱為最高使用標記 (hwm)。

3 hwm的資訊儲存在段頭當中.

hwm本身的資訊是儲存在段頭.在段空間是手工管理方式時,oracle是通過freelist(乙個單向鍊錶)來管理段內的空間分配.在段空間是自動管理方式時(assm),oracle是通過bitmap來管理段內的空間分配.

4 oracle的全表掃瞄是讀取高水位標記(hwm)以下的所有塊

當使用者發出乙個全表掃瞄時,oracle 始終必須從段一直掃瞄到 hwm,即使它什麼也沒有發現。該任務延長了全表掃瞄的時間。

採用truncate語句刪除乙個表的資料的時候,類似於重新建立了表,不僅把資料都刪除了,還把hwm給清空恢復為0。

在手動段空間管理(manual segment space management)中,段中只有乙個hwm,但是在oracle 9i release1才新增的自動段空間管理(automatic segment space management)中,又有了乙個低hwm的概念出來。為什麼有了hwm還又有乙個低hwm呢,這個是因為自動段空間管理的特性造成的。在手段段空間管理中,當資料插入以後,如果是插入到新的資料塊中,資料塊就會被自動格式化等待資料訪問。而在自動段空間管理中,資料插入到新的資料塊以後,資料塊並沒有被格式化,而是在第一次訪問這個資料塊的時候才格式化這個塊。所以我們又需要一條水位線,用來標示已經被格式化的塊。這條水位線就叫做低hwm。一般來說,低hwm肯定是低於等於hwm的。

額外擴充套件:

[test1@orcl] sql>delete from c;

[test1@orcl] sql>alter table c shrink space;

alter table c shrink space

*第 1 行出現錯誤:

ora-10636: row movement is not enabled

[test1@orcl] sql>alter table c enable row movement;

表已更改。

[test1@orcl] sql>alter table c shrink space;

表已更改。

[test1@orcl] sql>analyze table c compute statistics;

[test1@orcl] sql>select table_name,blocks,empty_blocks from user_tables where table_name='c';

table_name blocks empty_blocks

---------- ---------- ------------

c 1 7

6. 修正oracle表的高水位線

在oracle中,執行對錶的刪除操作不會降低該錶的高水位線。而全表掃瞄將始終讀取乙個段(extent)中所有低於高水位線標記的塊。如果在執行刪除操作後不降低高水位線標記,則將導致查詢語句的效能低下。

下面的方法都可以降低高水位線標記。

(1). 執行表重建指令 alter table table_name move;

當你建立了乙個物件如表以後,不管你有沒有插入資料,它都會占用一些塊,oracle也會給它分配必要的空間.同樣,用alter table move釋放自由空間後,還是保留了一些空間給這個表.

alter table ... move 後面不跟引數也行,不跟參數列還是在原來的表空間,move後記住重建索引。如果以後還要繼續向這個表增加資料,沒有必要move,只是釋放出來的空間,只能這個錶用,其他的表或者segment無法使用該空間。

(2). 執行alter table table_name shrink space;

注意,此命令為oracle 10g新增功能,再執行該指令之前必須允許行移動 alter table table_name enable row movement;

如果要同時壓縮表的索引:alter table test_tab shrink space cascade

(3). 複製要保留的資料到臨時表t,drop原表,然後rename臨時表t為原表

(4). 用邏輯匯入匯出: emp/imp

(5). alter table table_name deallocate unused

注:這證明,deallocate unused為釋放hwm上面的未使用空間,但是並不會釋放hwm下面的自由空間,也不會移動hwm的位置.

(6). 盡量使用truncate.

Oracle表段中的高水位線HWM

在 oracle 資料的儲存中,可以把儲存空間想象為乙個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在 oracle 中,這條線被稱為高水位線 high warter mark,hwm 在資料庫錶剛建立的時候,由於沒有任何資料,所以這個時候水位線是空的,也就是說 hwm為最低值。...

Oracle表段中的高水位線HWM

在oracle資料的儲存中,可以把儲存空間想象為乙個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線 叫做水位線,在oracle中,這條線被稱為高水位線 high warter mark,hwm 在資料庫錶剛建立的時候,由於沒有任何資料,所以這個時候水位線是空的,也就是說hwm為最低值。當插入了...

Oracle表段中的高水位線HWM

在oracle資料的儲存中,可以把儲存空間想象為乙個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在oracle中,這條線被稱為高水位線 high warter mark,hwm 在資料庫錶剛建立的時候,由於沒有任何資料,所以這個時候水位線是空的,也就是說hwm為最低值。當插入了資...