はじめに

テーブル間でパーティションを入れ替える方法をご紹介します。
例えば、テーブルの特定パーティションの洗い替えを行い、別テーブルのパーティションと入れ替えることができます。
その場合、洗い替えるテーブルは、特定のパーティションだけの保持で済むためディスク使用量が抑えられます。

下図は、LINEORDER_1テーブルのパーティション3とLINEORDER_2テーブルのパーティション3を入れ替えています。
また、LINORDER_2テーブルには、パーティション3のみデータを保持しています。

※パーティションのデータは動かさず、パーティション名を変更します。

構文

SWAP_PARTITIONS_BETWEEN_TABLES関数を使用してパーティションの入れ替えをします。

[SWAP_PARTITIONS_BETWEEN_TABLES関数の構文]
select SWAP_PARTITIONS_BETWEEN_TABLES([staging‑table],[min‑range‑value],[max‑range‑value],[target‑table],[force‑split])

[SWAP_PARTITIONS_BETWEEN_TABLES関数のパラメータ]
   パラメータ名          パラメータ値
staging‑table対象テーブル1
min‑range‑value対象パーティションキーの最小値
max‑range‑value対象パーティションキーの最大値
target‑table対象テーブル2
force‑splittrue : 必要に応じてROSコンテナを分割します。
false (default) : ROSコンテナを分割する必要がある場合はエラーが返されます。


実行例

カラムなどは同じでテーブル名だけが違うパーティションテーブルが2つ存在します。
lineorder_1とlineorder_2のテーブルの特定のパーティションを入れ替えます。


■テーブルの件数を確認します。


■テーブルのパーティションを確認します。
lineorder_2のパーティションは、1993のデータしかなく、lineorder_1より件数が多い状態です。


■lineorder_1とlineorder_2のpartition_keyである1993を入れ替えます。
パーティションの入れ替えはSWAP_PARTITIONS_BETWEEN_TABLES関数を使用します。


■テーブルの件数を確認します。
件数が異なるパーティションを入れ替えたため、lineorder_1の件数が増え、lineorder_2の件数が減っています。


■テーブルのパーティションを確認します。
パーティションキー値の1993でROSのサイズや件数(ros_size_bytes,ros_row_count)が入れ替わっていることがわかります。


制限事項

パーティションテーブルの入れ替えで下記テーブルを使用することはできません。
・Temporary tables(一時テーブル)
・Virtual tables(システムテーブルのテーブル)
・System tables(システムテーブルのビュー)
・External tables(外部テーブル)


検証バージョンについて

この記事の内容はVertica 9.0で確認しています。