ORACLE ROW MOVEMENT
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<span style="background-color:inherit;line-height:1.5;">ROW MOVEMENT特性最初是在8i時引入的,其目的是提高分割槽表的靈活性,這一特性預設是關閉,只要使用一下3個功能才需要開啟: </span>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">1.Flashback Table </b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
這一功能能幫助我們及時回滾一些誤操作,防止資料意外丟失。在使用該功能之前,必須先開啟ROW MOVEMENT,否則就會拋ORA-08189錯誤。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
select username, rowid from test_move;
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
delete from test_move where username = 'MYTBC';
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
commit;
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
alter table test_move enable row movement;
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
flashback table test_move to timestamp(systimestamp - interval '3' minute);
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
--閃回到3分鐘前得狀態,那時username='MYTBC'記錄未被刪除。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
select username, rowid from test_move;
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
--查詢可知,資料被找回來,此時,再比較flashback前後記錄的ROWID,大多數記錄的物理位置都變化。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
這個過程的內部操作, 可以透過對Flashback Table做SQL Trace來進一步觀察。透過Trace,我們不難發現,
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
Flashback Table實際是透過Flashback Query將表中資料進行了一次刪除、插入操作,因此ROWID會發生變化。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">2.Shrink Segment (減低表的高水位) </b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
Shrink Segment能幫助我們壓縮資料段、整理資料碎片、降低高水位,以提高效能、節省空間。它也同樣要求開啟ROW MOVEMENT。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
select username, rowid from test_move;
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
delete from test_move where username = 'MYTBC';
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
--這個時候 shrink space 會報10636錯誤
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
alter table test_move enable row movement;
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
alter table test_move shrink space;
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
select username, rowid from test_move;
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
我們可以看到在Shrink後,ROWID也變化了。從對其過程的Trace來看,Shrink對資料的改變不是透過SQL實現的,而是透過更底層的函式來實現的。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<b style="background-color:inherit;">3.更新Partition Key </b>
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
在更新記錄中的Partition Key時,可能會導致該記錄超出當前所在分割槽的範圍,需要將其轉移到其他對應分割槽上,因此要求開啟ROW MOVEMENT。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
drop table test_move;
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
create table test_move
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
partition by list (owner)
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
(partition p1 values ('SYS'),
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
partition p2 values ('DEMO'),
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
partition p3 values ('SYSTEM'),
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
partition def values (default))
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
as select * from dba_tables;
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
--這個時候update會報14402錯誤
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
alter table test_move enable row movement;
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
update test_move set owner='SYS' where owner='DEMO' and table_name='T_TEST';
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
這一操作產生影響的特殊之處在於這是個DML操作,是和online transaction密切相關。對於這樣一個UPDATE,實際上分為3步:先從原有分割槽將資料刪除;將原資料轉移到新分割槽上;更新資料。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
其影響就在於以下幾個方面:
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
一個UPDATE被分解為DELET、INSERT、UPDATE三個操作,增加了效能負擔。其中,DELETE的查詢條件與原UPDATE的查詢條件相同,新的UPDATE的查詢條件是基於INSERT生成的新的ROWID;
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
相應的Redo Log、Undo Log會增加;
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
如果Update語句還涉及到了Local Index的欄位的話,新、舊2個分割槽上的Local Index都要被更新。
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
<br style="background-color:inherit;" />
</div>
<div style="font-family:微軟雅黑;font-size:14px;line-height:21px;white-space:normal;widows:auto;background-color:#FFFFFF;">
還有一點,Row Movement會和域索引(Domain Index)產生衝突:如果表上定義了域索引,開啟Row Movement就會失敗;反之亦然。
</div>
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31520497/viewspace-2156735/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Row Movement Common Questions and Problems on Partitioned Tables
- Oracle中flashback table功能為什麼需要開啟row movement功能Oracle
- FAQ: Row Movement Common Questions and Problems on Partitioned Tables
- oracle效能診斷例項-row migration and row chainOracleAI
- Oracle vs PostgreSQL Develop(19) - PIPE ROWOracleSQLdev
- Oracle中rownum和row_number()Oracle
- 關於oracle中的row pieceOracle
- SAP MM Movement Type 503的使用
- 啟用oracle table rowdependencies trace row modificationOracle
- oracle 'row cache objects' 等待事件解釋OracleObject事件
- [ORACLE 11G]ROW CACHE LOCK 等待Oracle
- BAPI_GOODSMVT_CREATE to post Goods MovementAPIGo
- Oracle如何精確計算row的大小Oracle
- Row Migration和row chainedAI
- SAP BAPI BAPI_GOODSMVT_CREATE Goods movementAPIGo
- SAP標準移動型別(Movement Type)型別
- 【ASK_ORACLE】Row Cache Enqueue鎖之概念篇OracleENQ
- pipe row的用法, Oracle split 函式寫法.Oracle函式
- ORACLE Active dataguard 一個latch: row cache objects BUGOracleObject
- Oracle:Rank,Dense_Rank,Row_Number比較Oracle
- oracle分析函式Rank, Dense_rank, row_numberOracle函式
- Oracle Enqueues Wait Events 三 enq: TX - row lock contentionOracleENQAI
- Oracle 中的 ROW_NUMBER() OVER() 分析函式的用法Oracle函式
- oracle 分析函式之(rank()/dense_rank()/row_number())Oracle函式
- oracle實驗記錄 (ROW 壓縮,遷移,連結)Oracle
- MySQL裡的found_row()與row_count()MySql
- How to Match a Row Cache Object Child Latch to its Row CacheObject
- list chained rowAI
- Oracle中資料塊中row number缺失(記錄,未解決)Oracle
- Metlink:How to Match a Row Cache Object Child Latch to its Row CacheObject
- ORACLE11GR2 中使用 IGNORE_ROW_ON_DUPKEY_INDEXOracleIndex
- Oracle11gr2新增提示IGNORE_ROW_ON_DUPKEY_INDEXOracleIndex
- Row Migration and Row Chaining(行遷移和行連結)AI
- ORACLE 歸檔空間滿導致的enq: TX - row lock contentionOracleENQ
- [20151208]關於Oracle Row Lock.txtOracle
- Oracle分析函式RANK(),ROW_NUMBER(),LAG()等的使用方法(轉)Oracle函式
- Failed to restart Polybase Data Movement service after running sp_polybase_join_groupAIREST
- row cache objects latch研究Object