在網路上衝浪,逛著逛著竟然看到一篇很熟悉的文章,
http://www.odba.idv.tw/hwm.htm
這篇文章,我曾經在itpub上發表過,能被人家收錄在自己的BLOG中,我心裡的感覺應該是餘有榮焉吧...
這邊把我本來寫的文章post出來...

我的文章,很歡迎大家轉載,但是希望朋友轉載時能標明出處,這是對原著者的一種尊重喔...

===============================以下是原文===============================

High water mark 對資料庫空間的影響


 


High water mark的原理


    High Water Mark (HWM)指的是當我們建立一個segment的時候,在segment內的一個指標,界定了segment 內曾經配置過的block水位。


The high water mark is the boundary between used and unused space in a segment ~ (From Oracle Concept)


 


    簡單如圖所示,剛建立segment時尚未insert資料,HWM通常在segment header附近,當你不斷地insert資料使用了更多的block之後,HWM自然會跟著移動。但是日後你delete資料後,雖然實際儲存資料的block已經減少,但是HWM仍然不會改變,這就像水庫的水位曾經滿到某個刻度而留下一道水痕,雖然水位下降了但是仍然清晰可見那道高水位。



     HWM之下如果存在太多空的block,最大的缺點就是當發生Full Table Scan (FTS)的時候,會造成過多無謂的IO,因為FTS會讀取segment內的block直到HWM為止,如此也會造成buffer pool的使用效率不佳。


 


刪除大量資料後調整high water mark


1.      建立一個測試table名為Z_TABLE


   CREATE TABLE Z_TEST


(


  A  VARCHAR2(4000 BYTE),


  B  VARCHAR2(4000 BYTE),


  C  VARCHAR2(4000 BYTE)


)


TABLESPACE TCHLOL_DATA


PCTUSED    0


PCTFREE    10


INITRANS   1


MAXTRANS   255


STORAGE    (


            INITIAL          64K


            MINEXTENTS       1


            MAXEXTENTS       2147483645


            PCTINCREASE      0


            BUFFER_POOL      DEFAULT


           )


LOGGING


NOCOMPRESS


NOCACHE


NOPARALLEL


MONITORING;


2.      20000筆的資料


透過Quest Data factory工具來幫我們塞測試資料



 


select count(*) from Z_TEST;


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


40000


 


3.      check目前資料大小


select substr(segment_name,1,20) segment, bytes / 1024 "Size


[KB]" from user_segments


where segment_name in ('Z_TEST');


          


              segment       Size [KB]


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


              Z_TEST           81920


 


4.      刪除所有資料


delete from Z_TEST;


select count(*) from Z_TEST;


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


0


 


5.      計算目前的資料大小


select substr(segment_name,1,20) segment, bytes / 1024 "Size


[KB]" from user_segments


where segment_name in ('Z_TEST');


          


              segment       Size [KB]


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


              Z_TEST           81920


 


6.      調降high water mark


Alter table Z_TEST move;


 


7.      計算目前的資料大小


select substr(segment_name,1,20) segment, bytes / 1024 "Size


[KB]" from user_segments


where segment_name in ('Z_TEST');


          


              segment       Size [KB]


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


              Z_TEST               64        ß回復到最初init的大小


 


 


降低high water mark的方式


1.      EXP/IMP


2.      alter table XXX move


3.      alter table XXX shrink space  (only for ORACLE 10g )


 


alter table XXX shrink space使用Row lock,alter table XXX move則使用table lock



===============================原文結束===============================


arrow
arrow
    全站熱搜

    噗噗噗的潛水珽 發表在 痞客邦 留言(0) 人氣()