はじめに
COPY_PARTITIONS_TO_TABLE関数を使用して、特定のパーティションを別のテーブルにコピーすることができます。パーティションのコピーは、テーブルをコピーする”COPY_TABLE”と同じ動作であるため、非常に高速でコピーされます。
COPY_TABLEの動作に関しては下記を参照ください。
「既存のテーブルを高速にコピーする方法」
http://vertica-tech.ashisuto.co.jp/copy_table/
構文
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’]
)
パラメータ | 説明 |
---|---|
[[database.]schema.]source_table | ソーステーブルを指定 |
min_range_value | コピー対象とするパーティションデータの下限を指定 |
max_range_value | コピー対象とするパーティションデータの上限を指定 |
[[database.]schema.]target_table | ターゲットテーブルを指定 |
force_split | パーティションキーの範囲が複数のコンテナまたは単一のコンテナの一部にまたがる場合、ROSコンテナを分割するかどうかを指定します。 true :必要に応じてROSコンテナを分割します。 false:この操作を実行するためにROSコンテナを分割する必要がある場合、エラーを返します。 ※デフォルトはfalse |
・ソーステーブル:データの移行元テーブル
・ターゲットテーブル:データの移行先テーブル
使用例
任意の範囲のパーティションを、ソーステーブルからターゲットテーブルへコピーさせる一連の手順を以下にご案内します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
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制約を含む列定義
・セグメンテーションの有無
・パーティション句
・プロジェクション数
・プロジェクションのソート順
・主キーおよび一意キーの制約
※有効/無効の状態は問いません。
ただし、主キーまたは一意キーが有効になっているターゲットテーブルに対し、重複したパーティションキー列の値が挿入される場合、処理はロールバックされます。
テーブルの制限
以下のオブジェクトはソーステーブルあるいはターゲットテーブルとして使用できません。・一時テーブル
・ビュー
・システムテーブル
・外部テーブル