【PostgreSQL 11 新機能】Partitionwise Aggregate を検証してみた

こんにちは。サイオステクノロジー OSS サポート担当 Y です。

今回は先日リリースされた PostgreSQL 11 の新機能である “Partitionwise Aggregate (パーティション単位での集計)” を検証してみました。(※以下の内容は CentOS 7.5/PostgreSQL 11.0 にて検証しています。)

■はじめに

昨年リリースされた PostgreSQL 10 の新機能である Declarative Partitioning に関連する新機能として、PostgreSQL 11 では、パーティショニングされたテーブルにて集計処理を実施する際に、子テーブル (パーティション) 単位で集計処理を実施する機能が実装されています。

今回は、PostgreSQL 11.0 を使ってこの Partitionwise Aggregate を試してみようと思います。

■検証

それではさっそく、検証してみます。

まずは、PostgreSQL 11.0 にてパーティショニングされたテーブルを用意し、テスト用のデータを 300万レコードほど INSERT します。

今回検証する “Partitionwise Aggregate ” は、デフォルトで無効 (enable_partitionwise_aggregate = off) になっているため、この機能を使う場合は設定を有効にする必要がありますが、まずはデフォルト (無効) の状態でクエリを実行してみます。

上記の様に、テーブル hoge からレコードを取得 (各パーティション を Parallel Seq Scan してテーブル全体のレコードを取得) した後に、その結果に対して集約処理を実行するような実行計画になっています。

また、EXPLAIN ANALYZE 文にて実際にクエリを実行すると以下の様な感じになりました。

それでは次に、Partitionwise Aggregate を有効 (enable_partitionwise_aggregate = on) にして同じクエリを実行してみます。

すると、上記の様に各子テーブル (パーティション) 毎に集計処理を実施した上で、それらの結果をまとめるような実行計画になっています。

また、EXPLAIN ANALYZE 文にて実際にクエリを実行すると以下の様な感じになりました。

今回検証を行なった環境/クエリでは、Partitionwise Aggregate が無効になっている場合に比べて、クエリの実行時間が短くなっている (性能が改善している) ようです。

なお、enable_partitionwise_aggregate のドキュメントを参照すると、この Partitionwise Aggregate を実行するための実行計画の作成は CPU 及び Memory リソースを多く消費するため、デフォルトでは無効になっている旨の記載があります。

■最後に

PostgreSQL 11 では、前回検証した Partitionwise Join や、今回検証した Partitionwise Aggregate のような機能強化が複数実施されており、クエリ等の性能改善が期待できそうです。

しかし、(今回の検証では性能改善が見受けられましたが) 前述したドキュメントにも記載されている通りサーバリソース (CPU/Memory) を多く消費する可能性もあるようなので、新規機能を有効にするか否か、新規機能の恩恵を受けられるか否か (性能が改善するか否か) については、実際の環境毎に検証を実施した方が良さそうです。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*