1 行遷移的原因
啥是“行遷移”,Oracle的數據按照塊保存,如果一塊數據磁盤空間無法保存某個數據時(比如以前是1K,現在update到2K,而當前塊的空閑空間不足1K),則會將新的數據保存到另外一個新的塊里,然后在以前的塊保存一個新位置的地址連接。
比如

數據都保存在一個塊里面,中間有2塊的空閑空間,現在第四行數據要擴容。發現單塊的空閑空間不足,則評估合并的空閑空間是否滿足

評估合并后的空閑空間依然不滿足空間要求,則此時發生“行遷移”

在一個新的塊保存了新的第四行數據,然后在原始塊保存了新地址的連接。這就是行遷移的過程。
2 行遷移有什么影響呢?
如果你通過一個索引來讀這一行,索引會指向原來的塊,那個塊再指向這個新塊。要得到具體的行數據,一般并不是執行兩個左右的I/O 就可以得到行數據。單獨來看,這不是大問題,甚至根本注意不到。不過,如果這種行所占的比例相當大,而且有大量用戶在訪問這些行,你就會注意到這種副作用了。訪問這些數據的速度開始變慢(額外的I/O 以及與I/O 相關的閂定都會增加訪問時間),緩沖區緩存的效率開始下降(需要緩存兩個塊,而如果行沒有遷移就只需要緩存一個塊),另外表的大小好復雜性都有所增加。由于這些原因,你可能不希望遷移行。
3 總結
行遷移不能避免,增加每個塊的大小可以減少行遷移的可能行,但也會造成更大的空間浪費。這個平衡點需要根據應用不同進行確定。
新聞熱點
疑難解答