1. 程式人生 > >深入解析:Row Movement 的原理和效能影響與關聯

深入解析:Row Movement 的原理和效能影響與關聯

ROW MOVEMENT特性最初是在8i時引入的,其目的是提高分割槽表的靈活性——允許更新Partition Key。這一特性

預設是關閉,只是在使用到一些特殊功能時會要求開啟。除了之前提到的更新Partition Key,還有2個要求開啟的ROW MOVEMENT的功能就是flushback table和Shrink Segment。所以,只有當使用到以上3個功能特性時,ROW MOVEMENT才會真正起作用。我們如果需要知道ROW MOVEMENT會對系統產生什麼影響,就只要看這3個功能使用時會產生什麼影響。

 

Flashback Table

 

先看Flashback Table。這一功能能幫助我們及時回滾一些誤操作,防止資料意外丟失。在使用該功能之前,必須

先開啟ROW MOVEMENT,否則就會拋ORA-08189錯誤。我們看以下例子,可以說明在使用Flashback Table功能時,

ROW MOVEMENT產生了什麼作用:

https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/bURPjgFpGMSWcGPNoTRhHuCUavCLf3rmlcuPXurkEeUzvopGjd3tfu3RTxWO1Iia4V0xibCQVCPxUseKaMf9lGMg/640?wx_fmt=png&wxfrom=5&wx_lazy=1&retryload=1

此時,由於ROW MOVEMENT還未開啟,命令出錯。繼續完成演示:

https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/bURPjgFpGMSWcGPNoTRhHuCUavCLf3rmvic2MQLX3c7eOL9fuFmnTLWialHHxPc0PkBf3Xljkq3QBCUv4TuYoaQg/640?wx_fmt=png

當開啟ROW MOVEMENT後,表被順利的flashback了,資料被找回。此時,再比較flashback前後記錄的ROWID,大

多數記錄的物理位置都變化。這個過程的內部操作, 可以通過對Flashback Table做SQL Trace來進一步觀察。

通過Trace,我們不難發現,Flashback Table實際是通過Flashback Query將表中資料進行了一次刪除、插入操

作,因此ROWID會發生變化。

 

Shrink Segment

Shrink Segment能幫助我們壓縮資料段、整理資料碎片、降低高水位,以提高效能、節省空間。它也同樣要求開啟

ROW MOVEMENT。

https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/bURPjgFpGMSWcGPNoTRhHuCUavCLf3rm84Oria08MweQLen664UP4oPTmsK3khpbws3r9frqc051hlrrfv9EIRg/640?wx_fmt=png

https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/bURPjgFpGMSWcGPNoTRhHuCUavCLf3rmuLzjuxvDAialI675lsyiaGSJhHaiawQekjAmj1K5wC4FTjBiaDRibS3crMg/640?wx_fmt=png

同樣,我們可以看到在Shrink後,ROWID也變化了。從對其過程的Trace來看,Shrink對資料的改變不是通過SQL

實現的,而是通過更底層的函式來實現的。

從以上分析來看,在執行上面2種操作操作後,其最大影響就是資料的ROWID會發生變化。因此,他們對我們系統的影響就僅限於那些依賴於ROWID編寫的應用。

 

例如,一個程式需要對大量資料進行處理,為了提高效率和控制進度,程式碼會先將需要處理的資料記錄的ROWID取

出放入臨時表中,然後再根據ROWID對資料進行分批進行處理。當ROWID被取出後,如果對錶進行了上述操作,就

可能會導致後依賴ROWID進行的操作發生錯誤。但是,這兩種操作都屬於維護性操作,第一種操作發生的機會非常

少,從整體看,我們基本可以忽視這一操作對應用的影響;第二種操作也很少發生,並且可以在應用offline的時

間進行操作,因此它的影響也是有限的。

 

更新Partition Key

 

在更新記錄中的Partition Key時,可能會導致該記錄超出當前所在分割槽的範圍,需要將其轉移到其他對應分割槽上,

因此要求開啟ROW MOVEMENT。

https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/bURPjgFpGMSWcGPNoTRhHuCUavCLf3rmPcOwz0X32cW9KSHibjCSLyDb8EibzuXXFS3DgxDJT6yhYT82MH9DibMMA/640?wx_fmt=png

這一操作產生影響的特殊之處在於這是個DML操作,是和online transaction密切相關。對於這樣一個UPDATE,

實際上分為3步:先從原有分割槽將資料刪除;將原資料轉移到新分割槽上;更新資料。

其影響就在於以下幾個方面:

一個UPDATE被分解為DELET、INSERT、UPDATE三個操作,增加了效能負擔。其中,DELETE的查詢條件與原UPDATE

的查詢條件相同,新的UPDATE的查詢條件是基於INSERT生成的新的ROWID;

相應的Redo Log、Undo Log會增加;

如果Update語句還涉及到了Local Index的欄位的話,新、舊2個分割槽上的Local Index都要被更新。

 

結論

 

目前,ROW Movement真正會其作用(ROWID變化)只是在上述3種情況下,因此,需要分析其對系統會產生多大影響,就要分析上述三種操作在你的系統中出現的頻率、以及是否有應用程式依賴與ROWID實現。對於前面兩種,之前說過,它們發生的概率並不高,我個人認為基本上可以忽略它們對系統的影響。而對於最後一種,需要從應用角度進行分析——Partition Key被更新的頻率有多高?如果可能,最好實施一次等量負載下更細Partition Key的壓力測試,通過對比分割槽和非分割槽下其產生的效能統計資料做比較,其帶來的效能負載及Waits量與分割槽所獲取的查詢效能的提高相比,哪一種方式更有助於系統和應用的效能提高。

此外,有一點希望不要產生誤解,開啟ROW Movement並不會導致發生Row Migration時修改記錄的Rowid。

還有一點,Row Movement會和域索引(Domain Index)產生衝突:如果表上定義了域索引,開啟Row Movement就

會失敗;反之亦然。