OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

パーティションをコピーする方法(COPY_PARTITIONS_TO_TABLE関数)

公開日:
更新日:
基本操作
#テーブル

はじめに

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コンテナを分割するかどうかを指定します。

true :必要に応じてROSコンテナを分割します。
false:この操作を実行するためにROSコンテナを分割する必要がある場合、エラーを返します。
※デフォルトはfalse


・ソーステーブル:データの移行元テーブル
・ターゲットテーブル:データの移行先テーブル

使用例

任意の範囲のパーティションを、ソーステーブルからターゲットテーブルへコピーさせる一連の手順を以下にご案内します。

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 本記事を公開