web-dev-qa-db-ja.com

Oracleで範囲パーティションを作成するために既存のテーブルを変更する方法

10年分のデータが含まれている既存のテーブルがあります(ダンプを取得しました)。

テーブル内の1つの日付キー列で既存のテーブルを範囲分割したいと思います。

私が見る例のほとんどはCREATE TABLE..PARTITION BY RANGE...新しいパーティションを追加します。しかし、私のテーブルは既存のテーブルです。

ALTERステートメントが必要だと思います。

ALTER TABLE TABLE_NAME
PARTITION BY RANGE(CREATED_DATE)
 PARTITION JAN16 VALUES LESS THAN (01-02-2016),
 PARTITION FEB16 VALUES LESS THAN (01-03-2016) AND GREATER THAN(31-01-2016),//OR?
 PARTITION MAR16 VALUES BETWEEN (01-03-2016) AND (31-03-2016),  //OR?

2つの質問.

  1. パーティション化メカニズムを追加するためにAlterステートメントが必要ですか、それともcreateステートメントで作業する必要がありますか?

  2. 各パーティションに1か月のデータのみを保持するための適切な構文は何ですか。

9
Some Java Guy

テーブルがパーティション分割されていないため、次の2つのオプションがあります。

  1. データのエクスポート、テーブルのドロップ、新しいパーティションテーブルの作成、データのインポート。
  2. 分割して交換パーティション方式を使用します。 https://Oracle-base.com/articles/misc/partitioning-an-existing-table-using-exchange-partition

また、月ごとに新しいパーティションが必要な場合は、SET INTERVALをお読みください。例えば:

CREATE TABLE tst
   (col_date DATE)
 PARTITION BY RANGE (col_date) INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(PARTITION col_date_min VALUES LESS THAN (TO_DATE('2010-01-01', 'YYYY-MM-DD')));
2
hinotf

Oracle 12c Release 2を使用している場合は、単一のALTERを使用して、パーティション化されていないテーブルをパーティション化されたテーブルに変換できます(これは片道です)。

CREATE TABLE my_tab ( a NUMBER(38,0), b NUMBER(38,0)); 

ALTER TABLE MY_TAB MODIFY PARTITION BY RANGE (a) INTERVAL (1000) (   
    PARTITION p1 VALUES LESS THAN (1000)) ONLINE;

インデックスを変換することもできます:

update indexes (index_name [local/global]);

db <> fiddle demo

2
Lukasz Szozda