OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

テーブル間で特定のパーティションを入れ替える方法

公開日:
基本操作
#テーブル
#パーティショニング

はじめに

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

下図は、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のテーブルの特定のパーティションを入れ替えます。

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

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で確認しています。