はじめに
パーティション機能を利用すると、不要なデータへのアクセスを削減できパフォーマンスを向上できます。
しかし、これまでのパーティション機能は、テーブルの全データに対して、一定単位でしかパーティションを設定することができませんでした。そのため、粒度の細かいパーティションを設定すると、パーティション数の制限(1024)に抵触してしまう、という課題がありました。
この課題の解決策として、Vertica9.0より、階層パーティション機能が実装されました。
階層パーティション機能では、利用頻度の高いデータについては細かい粒度で、利用頻度の低いデータについては粒度の粗いパーティションを設定できます。
これらの特徴により階層パーティション機能を利用することで、以下の効果を期待することができます。
利用頻度の高いデータ:パフォーマンスの向上
利用頻度の低いデータ:パーティション数の制限に抵触せずデータを長期間保持
<階層パーティションのイメージ図>

本記事では、階層的パーティション機能の利用例をご紹介します。
階層パーティションの設定方法
階層パーティションはCALENDAR_HIERARCHY_DAY関数で設定できます
※CALENDAR_HIERARCHY_DAY関数はGROUP BY句内で使用する必要があります
/*** 構文 ***/
CALENDAR_HIERARCHY_DAY( partition‑expression[, active‑months[, active‑years] ] )
partition‑expression:パーティション化する列名
active‑months:日ごとのパーティションが有効な月数(デフォルト:2)
active‑years:月ごとのパーティションが有効な年数(デフォルト:2)実行例
sales_factのテーブルデータを直近3ヶ月は日単位、それ以前の直近2年間は月単位、過去2年以前は年単位でパーティション化する例を以下に記載します。
sales_factテーブルのsales_data
dbadmin=> ALTER TABLE sales_fact PARTITION BY sales_date
dbadmin-> GROUP BY (CALENDAR_HIERARCHY_DAY(sales_date, 3));
ALTER TABLE
変更内容を適用するために、再編成を実施するコマンドも併せて実行します。
dbadmin=> ALTER TABLE public.sales_fact REORGANIZE;
NOTICE 4785: Started background repartition table task
ALTER TABLEパーティションの設定を確認します。
直近3ヶ月(2017年の12月、11月、10月)については、日毎にパーティションされていて、それ以前の直近2年間は月単位、過去2年以前は年単位でパーティション化されていることが確認できます。
dbadmin=> SELECT DUMP_TABLE_PARTITION_KEYS('sales_fact'); Storage [ROS container]
~中略~
Partition keys on node v_testdb_node0001
Projection 'sales_fact_b0'
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-12-16
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-12-13
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-12-10
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-12-06
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-12-03
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-11-29
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-11-26
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-11-12
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-11-05
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-11-04
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-11-03
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-10-15
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-10-10
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-10-06
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-10-05
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017-10-04
Storage [ROS container]
No of partition keys: 6
Partition keys: 2017-09-01 2017-09-02 2017-09-16 2017-09-23 2017-09-26 2017-09-30
~中略~
Storage [ROS container]
No of partition keys: 45
Partition keys: 2015-01-03 2015-01-05 2015-01-06 2015-01-23 2015-01-26 2015-02-01 2015-02-22 2015-02-24 2015-03-18 2015-03-23 2015-03-26 2015-04-01 2015-04-27 2015-04-28 2015-05-03 2015-05-05 2015-05-09 2015-05-22 2015-05-27 2015-05-29 2015-06-04 2015-06-05 2015-06-13 2015-07-06 2015-07-15 2015-07-16 2015-07-20 2015-07-22 2015-08-11 2015-08-27 2015-08-31 2015-09-17 2015-09-22 2015-10-02 2015-10-05 2015-10-09 2015-10-12 2015-11-08 2015-11-16 2015-12-01 2015-12-02 2015-12-15 2015-12-16 2015-12-23 2015-12-30
~以下略~<上記例のイメージ図>

参考情報
Hierarchical Partitioning
https://my.vertica.com/docs/9.0.x/HTML/index.htm#Authoring/AdministratorsGuide/Partitions/HierarchicalPartitioning.htm
パーティショニングの概要
https://www.ashisuto.co.jp/cm/analytics-database/partition_overview.html
検証バージョンについて
この記事の内容はVertica 9.0で確認しています。
更新履歴
2022/07/20 「Verticaの主な制限事項」のリンクを削除
2017/12/22 本記事を公開