ORA-14402: 更新分區(qū)關(guān)鍵字列將導(dǎo)致分區(qū)的更改
默認(rèn)情況下,oracle的分區(qū)表對于分區(qū)字段是不允許進(jìn)行update操作的,如果有對分區(qū)字段行進(jìn)update,就會報錯——ORA-14402: 更新分區(qū)關(guān)鍵字列將導(dǎo)致分區(qū)的更改。這種情況可以通過開啟表的行移動來允許對分區(qū)字段的update 操作:
alter table xxx enable row movement;
之後就可以成功update 分區(qū)字段,同時因為行的物理移動,
導(dǎo)致rowid發(fā)生變化,對應(yīng)列值的索引葉塊 會標(biāo)記為刪除,插入新的葉塊,重定義完分區(qū)后,記得關(guān)閉行移動。
alter table xxx disable row movement;
下面三種情況需要開啟row movement
1.更新Partition Key
分區(qū)表某一行更新時,如果更新的是分區(qū)列,并且更新后的列值不屬于原來的這個分區(qū),如果開啟了這個選項,就會把這行從這個分區(qū)中delete掉,并加到更新后所屬的分區(qū)。相當(dāng)于一個隱式的delete+insert,但是不會觸發(fā)insert/delete觸發(fā)器。如果沒有開啟這個選項,就會在更新時報錯ORA-14402;
這一操作產(chǎn)生影響的特殊之處在于這是個DML操作,是和online transaction密切相關(guān)。對于這樣一個UPDATE,實際上分為3步:先從原有分區(qū)將數(shù)據(jù)刪除;將原數(shù)據(jù)轉(zhuǎn)移到新分區(qū)上;更新數(shù)據(jù)。
其影響就在于以下幾個方面:
一個UPDATE被分解為DELET、INSERT、UPDATE三個操作,增加了性能負(fù)擔(dān)。其中,DELETE的查詢條件與原UPDATE的查詢條件相同,新的UPDATE的查詢條件是基于INSERT生成的新的ROWID,相應(yīng)的Redo Log、Undo Log會增加;
如果Update語句還涉及到了Local Index的字段的話,新、舊2個分區(qū)上的Local Index都要被更新。
還有一點,Row Movement會和域索引(Domain Index)產(chǎn)生沖突:如果表上定義了域索引,開啟Row Movement就會失敗;反之亦然。
2. Flaskback table to 某時間
Flashback Table實際是通過Flashback Query將表中數(shù)據(jù)進(jìn)行了一次刪除、插入操作,因此ROWID會發(fā)生變化
3. Shrink Segment
Shrink Segment能幫助我們壓縮數(shù)據(jù)段、整理數(shù)據(jù)碎片、降低高水位,以提高性能、節(jié)省空間。
有必要說明一下,row movement并不是行遷移,最大的區(qū)別是
行遷移的rowid是不變的,行遷移是update 行記錄時,數(shù)據(jù)塊沒有足夠的空閒容納數(shù)據(jù)行,Oracle將此行移到其他數(shù)據(jù)塊,同時保留此行的rowid不變,并在原數(shù)據(jù)塊建一指針指向新的行位置。這種情況下,讀取一行數(shù)據(jù)就會訪問2個數(shù)據(jù)塊,增加IO,導(dǎo)致性能下降。
如果直接創(chuàng)建主鍵,使用的global index,當(dāng)某分區(qū)被drop后,主鍵會失效,
ALTERTABLE PHAECDA1.HCPSGLSINFOPZOW_NEW ADDCONSTRAINT PK_STAMP PRIMARYKEY(T_STAMP) tablespace xx;
改為 local index,但不包含分區(qū)段,報錯
ALTERTABLE PHAECDA1.HCPSGLSINFOPZOW_NEW ADDCONSTRAINT PK_STAMP PRIMARYKEY(T_STAMP) using index local tablespace xxx;
ORA-14039: partitioning columns must form a subset of key columns of a UNIQUE
ORA-14039: 分區(qū)列必須構(gòu)成 UNIQUE 索引的關(guān)鍵字列子集
Local index ,主鍵+分區(qū)鍵 作為新的主鍵,自動創(chuàng)建分區(qū)index ,index會按分區(qū)段Partition 分區(qū)到table的分區(qū)表空間
ALTERTABLE PHAECDA1.HCPSGLSINFOPZOW_NEW ADDCONSTRAINT PK_STAMP PRIMARYKEY(T_STAMP,CLDATE)USINGINDEXLOCAL;
先創(chuàng)建index ,再創(chuàng)建主鍵,
當(dāng)然,主鍵也可直接作為分區(qū)段