Oracle General Table->Partitioning Table Transformation(9億単位)
3536 ワード
背景:
環境:Linux 5.5 + Oracle 10.2.0.4
ある一般表Tは、前期の設計が不適切で区分がなかったため、現在数年来のデータ量は9億+に達している. スペース占有量は約350 Gで、オンライン再定義はパーティションテーブルが現実的ではないため、申請時間ウィンドウを採用してこのテーブルの応用を停止し、パーティションテーブルに改造した.
Tテーブルのデータ量が適切であれば、オンライン再定義操作を選択できる場合、参考:http://www.cnblogs.com/jyzhao/p/3876634.html 1.パーティションテーブル を作成する.新しいパーティションテーブルをnologgingに設定し、元のテーブルTをT_に名前を変更OLD 3.パラレルダイレクトパス挿入 4.パーティションテーブルのインデックス を作成する5.renameテーブル、回復Tテーブルの関連応用 1.パーティション表の作成
--Create tableパーティションテーブルT_を作成するPART、パーティション化は14年6月から.
パーティション追加ツールを使用して15年6月に追加します.
2.新しいパーティションテーブルをnologgingに設定し、元のテーブルTをT_に名前を変更するOLD
3.パラレルダイレクトパス挿入
Insertの実行計画を確認し、並列度が使用できることを確認します.
挿入スクリプトの実行
4.パーティション表の索引付け
4.1履歴テーブルのインデックス名の変更
4.2新規パーティションテーブルT_へPARTプライマリ・キーおよびインデックスの作成
4.3索引と表をlogging、noparallelに変更する
4.4問題
一意性インデックスの作成エラー:
解決策:一時表領域のサイズを増やす
5.rename表、T表の関連応用を回復する
rename T_PARTはTであり,Tテーブルアプリケーションを復元する.
実際の状況で徹底的にドロップするかどうかを決めるOLD、空間を解放します.
環境:Linux 5.5 + Oracle 10.2.0.4
ある一般表Tは、前期の設計が不適切で区分がなかったため、現在数年来のデータ量は9億+に達している. スペース占有量は約350 Gで、オンライン再定義はパーティションテーブルが現実的ではないため、申請時間ウィンドウを採用してこのテーブルの応用を停止し、パーティションテーブルに改造した.
Tテーブルのデータ量が適切であれば、オンライン再定義操作を選択できる場合、参考:http://www.cnblogs.com/jyzhao/p/3876634.html
--Create tableパーティションテーブルT_を作成するPART、パーティション化は14年6月から.
create table T_PART
(
……
)
partition by range(time_stamp)(
partition P20140601 values less than (TO_DATE(' 2014-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
tablespace DBS_D_JINGYU
);
パーティション追加ツールを使用して15年6月に追加します.
2.新しいパーティションテーブルをnologgingに設定し、元のテーブルTをT_に名前を変更するOLD
alter table t_part nologging;
rename T to T_old;
3.パラレルダイレクトパス挿入
alter session enable parallel dml;
insert /*+ append parallel(p,10) */ into t_part p select /*+ parallel(n,10) */ * from T_old n;
commit;
Insertの実行計画を確認し、並列度が使用できることを確認します.
explain plan for insert /*+ append parallel(p,10) */ into t_part p select /*+ parallel(n,10) */ * from T_old n;
挿入スクリプトの実行
SQL> @/home/oracle/insert
~~~~~~~~~~~~~~~~~~~~~~~~~
908792694 。
: 02: 09: 37.94
。
: 00: 08: 13.76
4.パーティション表の索引付け
4.1履歴テーブルのインデックス名の変更
alter index PK_T rename to PK_T_bak;
alter table T_old rename constraint PK_T to PK_T_bak;
alter index IDX_T_2 rename to IDX_T_2_bak;
alter index IDX_T_3 rename to IDX_T_3_bak;
4.2新規パーティションテーブルT_へPARTプライマリ・キーおよびインデックスの作成
create unique index PK_T on T_PART(OID, TIME_STAMP, SERIAL_NO, CITY_ID) local tablespace DBS_I_JINGYU nologging parallel 32;
。
: 04: 39: 53.10
alter table T_PART add constraint PK_T primary key (OID, TIME_STAMP, SERIAL_NO, CITY_ID);
。
: 00: 00: 00.43
create index IDX_T_2 on T_PART (TIME_STAMP, SERIAL_NO, CITY_ID) local tablespace DBS_I_JINGYU nologging parallel 32;
。
: 02: 27: 49.92
create index IDX_T_3 on T_PART (TIME_STAMP, CITY_ID) local tablespace DBS_I_JINGYU nologging parallel 32;
。
: 02: 19: 06.74
4.3索引と表をlogging、noparallelに変更する
alter index PK_T logging noparallel;
alter index IDX_T_2 logging noparallel;
alter index IDX_T_3 logging noparallel;
alter table T_PART logging;
4.4問題
一意性インデックスの作成エラー:
SQL> create unique index PK_T on T_PART(OID, TIME_STAMP, SERIAL_NO, CITY_ID) local tablespace dbs_i_jingyu nologging parallel 32;
create unique index PK_T on T_PART(OID, TIME_STAMP, SERIAL_NO, CITY_ID) local tablespace dbs_i_jingyu nologging parallel 32
ORA-12801: P000
ORA-01652: 128 ( TMP ) temp
解決策:一時表領域のサイズを増やす
alter tablespace TMP add tempfile '/usr3/oradata2/sysdata/tmp02.dbf' size 30G;
alter tablespace TMP add tempfile '/usr3/oradata2/sysdata/tmp03.dbf' size 30G;
alter tablespace TMP add tempfile '/usr3/oradata2/sysdata/tmp04.dbf' size 30G;
5.rename表、T表の関連応用を回復する
rename T_PARTはTであり,Tテーブルアプリケーションを復元する.
rename T_PART to T;
実際の状況で徹底的にドロップするかどうかを決めるOLD、空間を解放します.
drop table T_OLD purge;