約1 TB以上のデータを使用する24個のテーブルのセットがあります。そのため、DBAはパーティション分割を使用してより適切に処理することを提案しました。
現在のテーブルから一時テーブルへのデータ転送には時間がかかるため(dbms_redefinition)、既存のテーブルのパーティション分割に関する唯一の問題は、彼らが助言していないことです。これは、古いテーブルが使用される2テーブルアプローチの使用を提案している理由です。静的であり、新しいテーブルが分割され、必要に応じてselectが2つのテーブルの結合になります。
大幅なダウンタイムを必要とせずに既存のテーブルを分割する他の方法があるかどうかを調べたかっただけです。
Oracle Databaseは、テーブルの可用性に大きな影響を与えることなくテーブル構造を変更するメカニズムを提供します。このメカニズムは、オンラインテーブル再定義と呼ばれます。テーブルをオンラインで再定義すると、テーブルを再定義する従来の方法と比較して、可用性が大幅に向上します。
オンラインでテーブルを再定義すると、DMLからアクセスできるようになります。テーブルは、テーブルのサイズが重要ではない無視できる期間、排他モードでロックされます。
欠点は、テーブルのサイズ(1TB)に等しい追加のスペースが必要になることです。
更新:
非パーティションテーブルのパーティションテーブルへのオンライン変換
非パーティションテーブルは、オンラインでパーティションテーブルに変換できます。インデックスはこの操作の一部として維持され、パーティション化することもできます。変換は、進行中のDML操作に影響を与えません。
Oracle 12cリリース2では、ALTER TABLE
ステートメントを使用して、非パーティションテーブルをパーティションテーブルに変換できます。ただし、タグ付けのとおり、あなたは11g R2を使用しており、このオプションはありません。
ドキュメント:
データが95%コピーされたら、ダウンタイムをとります。
これの唯一の欠点は、テーブルのサイズ(1TB)に等しい追加のスペースです
古いテーブルは静的であり、新しいテーブルはパーティション化され、selectは必要に応じて2つのテーブルの結合になります。
これは、何もコピーしたり追加のスペースを必要としたりせずに、瞬時に行うのが本当に簡単です。1つのテーブルでこれを行うことができるため、UNIONを使用したり、何も書き直したりする必要はありません。
あなたのテーブルがこれだとしましょう:
create table t1 (col1 date, col2 number);
次に、既存のすべてのデータを格納できる1つのパーティションを持つこのテーブルのパーティションバージョンを作成します。
create table t1_exch (col1 date, col2 number)
partition by range (col1)
interval (numtodsinterval(1, 'day'))
(
partition p1 values less than (date'2017-03-11')
);
次に、テーブルをパーティションと交換します。
alter table t1_exch exchange partition p1 with table t1;
最後に古いテーブルを削除し、新しいテーブルの名前を変更して古いテーブルの名前を使用します。
drop table t1 purge;
alter table t1_exch rename to t1;
'2017-03-11'
の後に挿入されたデータは自動的にパーティション分割され、古いデータをそのままにしておくことも、必要に応じてパーティションに分割することもできます。
データのパーティション分割は簡単です。面倒な部分は、グローバルである必要がある制約とインデックスを処理することです。 PKと一意の制約(およびインデックス)を変更する必要がある場合があります。そのようなインデックスは、パーティション化キーが含まれていないとローカルでパーティション化できないためです。また、古いテーブルを削除して新しいテーブルを配置しているため、このテーブルを指すFK制約を整理する必要があります。