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つの質問.
パーティション化メカニズムを追加するためにAlterステートメントが必要ですか、それともcreateステートメントで作業する必要がありますか?
各パーティションに1か月のデータのみを保持するための適切な構文は何ですか。
テーブルがパーティション分割されていないため、次の2つのオプションがあります。
また、月ごとに新しいパーティションが必要な場合は、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')));
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]);