はじめに
作成した非パーティションテーブルをパーティションテーブルに変更する方法をご紹介します。
非パーティションテーブルにデータをロードした後でもテーブルを再作成することなくオンラインでパーティションテーブルに変更することがきます。
パーティショニングに関しては以下を参照ください。
パーティショニングの概要
https://www.ashisuto.co.jp/cm/analytics-database/partition_overview.html
パーティションテーブルに変更する方法
■lineorder表を非パーティションで作成します。
dbadmin=> CREATE TABLE ssbm.LINEORDER (LO_ORDERKEY NUMERIC(10),
LO_LINENUMBER INTEGER,
LO_CUSTKEY NUMERIC(10),
LO_PARTKEY INTEGER,
LO_SUPPKEY NUMERIC(10),
LO_ORDERDATE DATE NOT NULL, <=== ★
LO_ORDERPRIORITY CHAR(15),
LO_SHIPPRIORITY CHAR(1),
LO_QUANTITY NUMERIC(10),
LO_EXTENDEDPRICE NUMERIC(10),
LO_ORDERTOTALPRICE NUMERIC(10),
LO_DISCOUNT NUMERIC(10),
LO_REVENUE NUMERIC(10),
LO_SUPPLYCOST NUMERIC(10),
LO_TAX NUMERIC(10),
LO_COMMIT_DATE NUMERIC(10),
LO_SHIPMODE CHAR(10))
;
■lineorder表にデータがロードされた状態でlo_orderdate列(DATE型)の年でパーティショニングします。
dbadmin=> ALTER TABLE lineorder PARTITION BY EXTRACT(year from lo_orderdate) REORGANIZE;
■lineorder表がパーティション化されていることを確認します。
dbadmin=> SELECT PARTITION_KEY,PROJECTION_NAME,ROS_SIZE_BYTES,ROS_ROW_COUNT,NODE_NAME FROM partitions ORDER BY partition_key;
PARTITION_KEY | PROJECTION_NAME | ROS_SIZE_BYTES | ROS_ROW_COUNT | NODE_NAME
---------------+-----------------+----------------+---------------+-----------------
1992 | LINEORDER_super | 43775956 | 1513933 | v_vdb2_node0001
1993 | LINEORDER_super | 43909447 | 1518755 | v_vdb2_node0001
1994 | LINEORDER_super | 43941216 | 1519659 | v_vdb2_node0001
1995 | LINEORDER_super | 43891114 | 1518060 | v_vdb2_node0001
1996 | LINEORDER_super | 44015590 | 1522426 | v_vdb2_node0001
1997 | LINEORDER_super | 43829193 | 1515763 | v_vdb2_node0001
1998 | LINEORDER_super | 25655660 | 891404 | v_vdb2_node0001
PARTITION_KEYを確認することで年単位でパーティショニングされていることがわかります。
※すでに最適化された状態であれば、パーティションテーブルに変更した後に最適化を行う必要はありません。考慮事項
・パーティションの対象列にはNOT NULL制約を設定する必要があります。
・パーティション句の式で使用されるSQL関数は不変でなければなりません。
・パーティション句で集合演算(MAXやAVGなど)などのクエリは指定できません。
・非パーティションテーブルからパーティションテーブルに変更する際は負荷が高くなりますので、システムに影響がない時間帯で行ってください。
検証バージョンについて
この記事の内容はVertica 9.2で確認しています。
更新履歴
2019/03/13 検証バージョンを9.2に変更
2015/11/18 本記事を公開