Oracle 降低高水位線

孤竹星發表於2015-03-30
高水位線


什麼是高水位線(High Water Mark)?
所有的oracle段(segments)都有一個在段內容納資料的上限,我們把這個上限稱為“High Water Mark”
或HWM。這個HWM是一個標記,用來說明已經有多少沒有使用的資料塊分配給這個segment。HWM通常增長的
幅度為一次5個資料庫,原則上HWM只會增大,不會縮小,即使將表中的資料全部刪除,HWM還是為原值,
由於這個特點,使HWM很像一個水庫的歷史最高水位。


HWM資料庫的操作有如下影響:


a) 全表掃描通常要讀出直到HWM標記的所有的屬於該表資料庫塊,即使該表中沒有任何資料。


b)即使HWM以下有空閒的資料庫塊,鍵入在插入資料時使用了append關鍵字,則在插入的時候使用HWM以上
   的資料塊此時HWM會自動增大。


如何知道一個表的HWM


實驗如下過程:


1)建立一個表插入一些資料


SQL> select * from t2;


NAME
-----------------------------------------------
半形北京(科技)有限(責任)公司
北京(科技)有限(責任)公司
半形北京(科技)有限(責任)公司
北京(科技)有限(責任)公司
半形北京(科技)有限(責任)公司
北京(科技)有限(責任)公司
半形北京(科技)有限(責任)公司
北京(科技)有限(責任)公司
半形北京(科技)有限(責任)公司


已選擇9行。


SQL> analyze table t2 estimate statistics;


表已分析。


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


    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         4            4          9


SQL> insert into t2 select * from t2;


已建立9行。


SQL> /


已建立18行。


SQL> /


已建立36行。


。。。


SQL> /


已建立18432行。


SQL> analyze table t2 compute statistics;


表已分析。


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


    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
       247            9      36864


SQL> delete t2 where rownum<50000;


已刪除36864行。


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


    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
       247            9      36864


SQL> analyze table t2 compute statistics;


表已分析。


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


    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
       247            9          0


SQL> alter table t2 enable row movement;


表已更改。


SQL> alter table t2 shrink space;


表已更改。


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


    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
       247            9          0


SQL> analyze table t2 compute statistics;

表已分析。

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


    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         1            7          0

SQL> alter table t2 disable row movement;

表已更改。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28282660/viewspace-1479094/,如需轉載,請註明出處,否則將追究法律責任。

相關文章