行遷移和行連結

tonywi888發表於2011-12-20
row migration和row chaining
oracle block由三個部分組成,header,free space,data
資料塊頭head:主要包含資料塊地址的一些基本資訊和段的型別,以及表和包含有資料的實際行的地址。
自由空間free space:是指可以為以後的更新和插入操作分配的空間,其大小受pctfree和pctused兩個引數影響。
實際資料data:是指在行記憶體儲的實際資料。

當建立或者更改任何表和索引的時候,oracle在空間控制方面使用兩個儲存引數:
pctfree:為將來更新已經存在的資料預留空間的百分比。
pctused:用於為插入一新行資料的最小空間的百分比。這個值決定了塊的可用狀態。可用的塊是可以執行插入的塊,不可用狀態的塊只能執行行刪除和修改,可用狀態的塊被放在freelist中。
當表中的資料不能在一個資料block中放入的時候,就會發生行連結和行遷移。

 row migration:當一行記錄初始可以儲存在一個block中,由於更新導致行長增加了,而block的自由空間已經完全滿了,就會產生行遷移。由於表的pctfree引數設定太小,而導致沒有空間容納更新的記錄,可以調整和控制清除的。
row chaining:第一次插入資料是,如果一個block不能存放一樣記錄,oracle將使用這個段中其他block儲存,行連結發生在比較大的行上,例如行上有long、long raw、lob等資料型別的欄位,這種情況行連結不可避免的產生。主要由於資料庫的db_block_size不夠大,只有增大db_block_size沒有任何辦法。一般在建庫初期設定好,否則沒有太多可以調整的地方。

監測方法:
利用oracle資料庫自身提供的指令碼utlchain.sql生成chained_rows表,然後利用
analyze table table_name list chained rows into chained_rows命令逐個分析表,將分析結果存入chained_rows中。

清除方法:
對於行遷移一般分兩步,控制行遷移的增長,使其不再增多;清除以前存在的行遷移。
確定pctfree引數的大小,有兩種方法:
1、利用公式來設定pctfree的大小。
analyze table table_name estimate statistics命令來分析要修改pctfree的表,然後檢視user_tables中的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)
2、差分微調的方法,一點一點增大,每次不要超過5%,然後使用analyze table table_name list chained rows into chained_rows命令分析每次所有的情況,不要調的過大,一般在40%以下就可以了。

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

相關文章