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

※パーティションのデータは動かさず、パーティション名を変更します。
構文
SWAP_PARTITIONS_BETWEEN_TABLES関数を使用してパーティションの入れ替えをします。
[SWAP_PARTITIONS_BETWEEN_TABLES関数の構文]
[SWAP_PARTITIONS_BETWEEN_TABLES関数のパラメータ]
| パラメータ名 | パラメータ値 |
| staging‑table | 対象テーブル1 |
| min‑range‑value | 対象パーティションキーの最小値 |
| max‑range‑value | 対象パーティションキーの最大値 |
| target‑table | 対象テーブル2 |
| force‑split | true : 必要に応じてROSコンテナを分割します。 false (default) : ROSコンテナを分割する必要がある場合はエラーが返されます。 |
実行例
カラムなどは同じでテーブル名だけが違うパーティションテーブルが2つ存在します。
lineorder_1とlineorder_2のテーブルの特定のパーティションを入れ替えます。
■テーブルの件数を確認します。
dbadmin=> select count(*) from lineorder_1;
count
----------
59986052
(1 row)
dbadmin=> select count(*) from lineorder_2;
count
----------
18216054
(1 row)■テーブルのパーティションを確認します。
lineorder_2のパーティションは、1993のデータしかなく、lineorder_1より件数が多い状態です。
・lineorder_1のパーティション
dbadmin=> select * from partitions where projection_name = 'lineorder_1_DBD_5_rep_dbd' order by partition_key;
partition_key | projection_id | table_schema | projection_name | ros_id | ros_size_bytes | ros_row_count | node_name | deleted_row_count | location_label
---------------+-------------------+--------------+---------------------------+-------------------+----------------+---------------+----------------+-------------------+----------------
1992 | 45035996273719492 | public | lineorder_1_DBD_5_rep_dbd | 45035996273721261 | 226953325 | 9117084 | v_pdb_node0001 | 0 |
1993 | 45035996273719492 | public | lineorder_1_DBD_5_rep_dbd | 45035996273721223 | 226732338 | 9108027 | v_pdb_node0001 | 0 |
1994 | 45035996273719492 | public | lineorder_1_DBD_5_rep_dbd | 45035996273721185 | 226620104 | 9103367 | v_pdb_node0001 | 0 |
1995 | 45035996273719492 | public | lineorder_1_DBD_5_rep_dbd | 45035996273721147 | 226565543 | 9101144 | v_pdb_node0001 | 0 |
1996 | 45035996273719492 | public | lineorder_1_DBD_5_rep_dbd | 45035996273721109 | 227181776 | 9126362 | v_pdb_node0001 | 0 |
1997 | 45035996273719492 | public | lineorder_1_DBD_5_rep_dbd | 45035996273721071 | 226498729 | 9098423 | v_pdb_node0001 | 0 |
1998 | 45035996273719492 | public | lineorder_1_DBD_5_rep_dbd | 45035996273721033 | 130966116 | 5331645 | v_pdb_node0001 | 0 |
(7 rows)
・lineorder_2のパーティション
dbadmin=> select * from partitions where projection_name = 'lineorder_2_DBD_6_rep_dbd' order by partition_key;
partition_key | projection_id | table_schema | projection_name | ros_id | ros_size_bytes | ros_row_count | node_name | deleted_row_count | location_label
---------------+-------------------+--------------+---------------------------+-------------------+----------------+---------------+----------------+-------------------+----------------
1993 | 45035996273719530 | public | lineorder_2_DBD_6_rep_dbd | 45035996273722925 | 416602988 | 18216054 | v_pdb_node0001 | 0 |
(1 row)■lineorder_1とlineorder_2のpartition_keyである1993を入れ替えます。
パーティションの入れ替えはSWAP_PARTITIONS_BETWEEN_TABLES関数を使用します。
dbadmin=> select SWAP_PARTITIONS_BETWEEN_TABLES('public.lineorder_1',1993,1993,'public.lineorder_2');
SWAP_PARTITIONS_BETWEEN_TABLES
----------------------------------------------------------------------------------------------------------------------------------
1 partition values from table public.lineorder_1 and 1 partition values from table public.lineorder_2 are swapped at epoch 706.
(1 row)■テーブルの件数を確認します。
件数が異なるパーティションを入れ替えたため、lineorder_1の件数が増え、lineorder_2の件数が減っています。
dbadmin=> select count(*) from lineorder_1;
count
----------
69094079
(1 row)
dbadmin=> select count(*) from lineorder_2;
count
---------
9108027
(1 row)■テーブルのパーティションを確認します。
パーティションキー値の1993でROSのサイズや件数(ros_size_bytes,ros_row_count)が入れ替わっていることがわかります。
・lineorder_1のパーティション
dbadmin=> select * from partitions where projection_name = 'lineorder_1_DBD_5_rep_dbd' order by partition_key;
partition_key | projection_id | table_schema | projection_name | ros_id | ros_size_bytes | ros_row_count | node_name | deleted_row_count | location_label
---------------+-------------------+--------------+---------------------------+-------------------+----------------+---------------+----------------+-------------------+----------------
1992 | 45035996273719492 | public | lineorder_1_DBD_5_rep_dbd | 45035996273721261 | 226953325 | 9117084 | v_pdb_node0001 | 0 |
1993 | 45035996273719492 | public | lineorder_1_DBD_5_rep_dbd | 45035996273722925 | 416602988 | 18216054 | v_pdb_node0001 | 0 |
1994 | 45035996273719492 | public | lineorder_1_DBD_5_rep_dbd | 45035996273721185 | 226620104 | 9103367 | v_pdb_node0001 | 0 |
1995 | 45035996273719492 | public | lineorder_1_DBD_5_rep_dbd | 45035996273721147 | 226565543 | 9101144 | v_pdb_node0001 | 0 |
1996 | 45035996273719492 | public | lineorder_1_DBD_5_rep_dbd | 45035996273721109 | 227181776 | 9126362 | v_pdb_node0001 | 0 |
1997 | 45035996273719492 | public | lineorder_1_DBD_5_rep_dbd | 45035996273721071 | 226498729 | 9098423 | v_pdb_node0001 | 0 |
1998 | 45035996273719492 | public | lineorder_1_DBD_5_rep_dbd | 45035996273721033 | 130966116 | 5331645 | v_pdb_node0001 | 0 |
(7 rows)
・lineorder_2のパーティション
dbadmin=> select * from partitions where projection_name = 'lineorder_2_DBD_6_rep_dbd' order by partition_key;
partition_key | projection_id | table_schema | projection_name | ros_id | ros_size_bytes | ros_row_count | node_name | deleted_row_count | location_label
---------------+-------------------+--------------+---------------------------+-------------------+----------------+---------------+----------------+-------------------+----------------
1993 | 45035996273719530 | public | lineorder_2_DBD_6_rep_dbd | 45035996273721223 | 226732338 | 9108027 | v_pdb_node0001 | 0 |
(1 row)制限事項
パーティションテーブルの入れ替えで下記テーブルを使用することはできません。
・Temporary tables(一時テーブル)
・Virtual tables(システムテーブルのテーブル)
・System tables(システムテーブルのビュー)
・External tables(外部テーブル)
検証バージョンについて
この記事の内容はVertica 9.0で確認しています。