はじめに
COPY_PARTITIONS_TO_TABLE関数を使用して、特定のパーティションを別のテーブルにコピーすることができます。
パーティションのコピーは、テーブルをコピーする”COPY_TABLE”と同じ動作であるため、非常に高速でコピーされます。
COPY_TABLEの動作に関しては下記を参照ください。
「既存のテーブルを高速にコピーする方法」
https://www.ashisuto.co.jp/cm/analytics-database/copy_table.html
構文
COPY_PARTITIONS_TO_TABLE (
‘[[database.]schema.]source_table’,
‘min_range_value’,
‘max_range_value’,
‘[[database.]schema.]target_table’
[, ‘force_split’]
)
パラメータ | 説明 |
|---|---|
[[database.]schema.]source_table | ソーステーブルを指定 |
min_range_value | コピー対象とするパーティションデータの下限を指定 |
max_range_value | コピー対象とするパーティションデータの上限を指定 |
[[database.]schema.]target_table | ターゲットテーブルを指定 |
force_split | パーティションキーの範囲が複数のコンテナまたは単一のコンテナの一部にまたがる場合、ROSコンテナを分割するかどうかを指定します。 |
・ソーステーブル:データの移行元テーブル
・ターゲットテーブル:データの移行先テーブル
使用例
任意の範囲のパーティションを、ソーステーブルからターゲットテーブルへコピーさせる一連の手順を以下にご案内します。
dbadmin=> select * from test_part_table1 order by 1,2;
col1 | col2 | col3
------------+--------+------
2017-01-01 | 名古屋 | 150
2017-01-01 | 大阪 | 140
2017-01-01 | 東京 | 150
2017-01-01 | 福岡 | 170
2018-01-01 | 名古屋 | 160
2018-01-01 | 大阪 | 150
2018-01-01 | 東京 | 160
2018-01-01 | 福岡 | 180
2019-01-01 | 名古屋 | 170
2019-01-01 | 大阪 | 160
2019-01-01 | 東京 | 170
2019-01-01 | 福岡 | 190
2020-01-01 | 名古屋 | 180
2020-01-01 | 大阪 | 170
2020-01-01 | 東京 | 180
2020-01-01 | 福岡 | 200
(16 rows)
■”test_part_table1”テーブルは、2017~2020の4つのパーティションキーで作成されています。
パーティションキーは、COL1列の年で作成しています。
dbadmin=> select pr.anchor_table_name table_name,par.partition_key from partitions par,projections pr where par.projection_id = pr.projection_id order by 2;
table_name | partition_key
------------------+---------------
test_part_table1 | 2017
test_part_table1 | 2018 <== 2017~2020の4つのパーティション
test_part_table1 | 2019
test_part_table1 | 2020
(4 rows)
■”test_part_table2”テーブルにはデータが存在していません。
dbadmin=> select * from test_part_table2 order by 1,2;
col1 | col2 | col3
------+------+------
(0 rows)
■”test_part_table1”テーブルの2019と2020のパーティションを作成済のテーブル”test_part_table2”にコピーします。
dbadmin=> SELECT COPY_PARTITIONS_TO_TABLE ('test_part_table1',2019,2020,'test_part_table2');
COPY_PARTITIONS_TO_TABLE
---------------------------------------------------
2 distinct partition values copied at epoch 273.
(1 row)
■”test_part_table1”テーブルの2019と2020のパーティションが”test_part_table2”テーブルにコピーされています。
dbadmin=> select * from test_part_table2 order by 1,2;
col1 | col2 | col3
------------+--------+------
2019-01-01 | 名古屋 | 170
2019-01-01 | 大阪 | 160
2019-01-01 | 東京 | 170
2019-01-01 | 福岡 | 190
2020-01-01 | 名古屋 | 180
2020-01-01 | 大阪 | 170
2020-01-01 | 東京 | 180
2020-01-01 | 福岡 | 200
(8 rows)
■”test_part_table1”テーブルの2018と2019のパーティションを未作成のテーブル”test_part_table3”にコピーします。
dbadmin=> SELECT COPY_PARTITIONS_TO_TABLE ('test_part_table1',2018,2019,'test_part_table3');
COPY_PARTITIONS_TO_TABLE
-----------------------------------------------------------------------------------
Created table test_part_table3. ★”test_part_table3”テーブルが作成される
2 distinct partition values copied at epoch 274.
(1 row)
■”test_part_table3”テーブルが作成され、”test_part_table1”テーブルの2018と2019のパーティションがコピーされています。
dbadmin=> select * from test_part_table3 order by 1,2;
col1 | col2 | col3
------------+--------+------
2018-01-01 | 名古屋 | 160
2018-01-01 | 大阪 | 150
2018-01-01 | 東京 | 160
2018-01-01 | 福岡 | 180
2019-01-01 | 名古屋 | 170
2019-01-01 | 大阪 | 160
2019-01-01 | 東京 | 170
2019-01-01 | 福岡 | 190
(8 rows)注意事項
権限について
COPY_PARTITIONS_TO_TABLEを実行するには、次の内いずれかの一つ条件を満たす必要があります。
・ソーステーブルの所有者かUSAGE権限が必要です。
・ターゲットテーブルを作成する場合は、CREATE権限が必要です。
テーブル属性の要件
ソーステーブルとターゲットテーブルの下記の属性は同じでなければいけません。
・NOT NULL制約を含む列定義
・セグメンテーションの有無
・パーティション句
・プロジェクション数
・プロジェクションのソート順
・主キーおよび一意キーの制約
※有効/無効の状態は問いません。
ただし、主キーまたは一意キーが有効になっているターゲットテーブルに対し、重複したパーティションキー列の値が挿入される場合、処理はロールバックされます。
テーブルの制限
以下のオブジェクトはソーステーブルあるいはターゲットテーブルとして使用できません。
・一時テーブル
・ビュー
・システムテーブル
・外部テーブル
検証バージョンについて
この記事の内容はVertica 9.3で確認しています。
更新履歴
2020/2/6 本記事を公開