はじめに
テーブル間でパーティションを入れ替える方法をご紹介します。例えば、テーブルの特定パーティションの洗い替えを行い、別テーブルのパーティションと入れ替えることができます。
その場合、洗い替えるテーブルは、特定のパーティションだけの保持で済むためディスク使用量が抑えられます。
下図は、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‑split | true : 必要に応じてROSコンテナを分割します。 false (default) : ROSコンテナを分割する必要がある場合はエラーが返されます。 |
実行例
カラムなどは同じでテーブル名だけが違うパーティションテーブルが2つ存在します。lineorder_1とlineorder_2のテーブルの特定のパーティションを入れ替えます。
■テーブルの件数を確認します。
1 2 3 4 5 6 7 8 9 10 11 |
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より件数が多い状態です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
・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関数を使用します。
1 2 3 4 5 6 |
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の件数が減っています。
1 2 3 4 5 6 7 8 9 10 11 |
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)が入れ替わっていることがわかります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
・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(外部テーブル)