row chaining & row migrate

行連接(row chaining):指一行存儲在多個塊中的情況,這是因爲該行的長度超過了一個塊的可用空間大小,即行鏈接是跨越多塊的行。

行遷移(row migrate):當一行的記錄初始插入時是可以存儲在一個block中的,由於更新操作導致行增加了,而block的自由空間已經完全滿了,這個時候就產生了行遷移。在這種情況下,oracle將會把整行數據遷移到一個新的block中(假設一個block中可以存儲下整行數據),oracle會保留被遷移的行的原始指針指向新的存放行數據的block,這就意味着被遷移行的ROW ID是不會改變的指一個數據行不適合放入當前塊而被重新定位到另一個塊(那裏有充足的空間)中,但在原始塊中保留一個指針的情形。原始塊中的指針是必需的,因爲索引的ROWID項仍然指向原始位置


三.行遷移(Row Chaining)與行鏈接(Row Migration)的清除

         行鏈接主要是由於數據庫的db_block_size不夠大,對於一些大的字段沒法在一個block中存儲下而產生的。對於行鏈接,除了增大db_block_size之外沒有別的任何辦法避免,但是因爲數據庫建立後db_block_size是不可以改變的(9i以前),對於oracle 9i數據庫意義對不同的表空間指定不同的db_block_size,因此行鏈接的產生幾乎是不可避免的,也沒有太多可以調整的地方。行遷移主要是由於更新表的時候,由於block上的PCTFREE參數設置過小所置,要實現控制行遷移的增長,就必須設置一個合理的PCTFREE參數,否則即使清除了當前的行遷移後馬上又會產生新的行遷移。如果PCTFREE參數設置過大則會導致block的利用率低,大量的空間浪費。如何設置一個合理的PCTFREE值有兩種方法可參考:

         1.定量設定法:

           就是利用公式來設定PCTFREE的大小,選使用ANALYZE TABLE table_name ESTIMATE STATISTICS命令來分析要修改的PCTFREE的表,然後查看user_table中的AVG_ROW_LEN列值,得到第一個平均長度AVG_ROW_LEN1,然後大量的操作以後,再次得到第二個平均長度AVG_ROW_LEN2,然後用公式:100*(AVG_ROW_LEN2-AVG_ROW_LEN1)/(AVG_ROW_LEN2-AVG_ROW_LEN1+AVG_ROW_LEN) 的出的結果就是定量計算出來的一個合適的PCTFREE數值。這種方法因爲是定量計算出來的,不一定會準確,而且因爲要分析表,所以對於使用RBO執行計劃的系統不是很適用,例如,AVG_ROW_LEN1=60。AVG_ROW_LEN2=70,則平均修改量爲10,PCTFREE應該調整爲100*10/(10+60)=16.7%。

         2.差分微調法:

           先查詢到當前的PCTFREE值,然後監控和調整PCTFREE參數,每次增加一點PCTFREE的大小,每次增加的比例不要超過5個百分點,然後使用ANALYZE TABLE table_name LIST CHAINED ROWS INTO chained_rows命令分析每次所有的行遷移和行連接的增長情況,對於不同的表採取不同的增長比例,對於行遷移增長的比較快的表的PCTFREE值就增加的多點,對於增加的慢的表的PCTFREE值增加少點,知道表的行遷移基本保持不增長爲止。但是PCTFREE不應該增加的過大,一般在40%以下就可以了,否則就會造成空間的很大浪費和增加數據庫訪問I/O。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章