PostgreSQL 16 クエリプランナーの新機能
- PostgreSQL 16 はクエリプランナーに多くの改善を導入し、多くの SQL クエリが以前のバージョンより高速に実行されるようになった。
- PG16 のリリースノートでこれらのプランナー改善を確認できるが、PostgreSQL の各リリースには変更点が多く、各変更について詳しい説明を提供するのは難しい。
- このブログ記事では、PostgreSQL 16 クエリプランナーで行われた 10 の改善点を掘り下げて分析し、PG15 と PG16 のプランナー出力の比較とともに、何が変わったのかを示す例を提供している。
PostgreSQL 16 クエリプランナーの 10 の改善点
- 増分ソート: PostgreSQL 13 で初めて導入された増分ソートは、結果セットの一部がすでに 1 つ以上の先行列でソートされている場合にそれを活用し、残りの列に対してのみソートを行う。
- ソート済みデータを使う集約: PostgreSQL 16 のクエリプランナーは、集約ノードに対して行をソート済みの順序で供給する計画を形成しようとするようになった。
- メモ化: PostgreSQL 14 で初めて導入されたメモ化計画ノードは、重複した値の参照を避けるためのキャッシュ層として機能する。
- アンチジョイン: PostgreSQL 16 では、アンチジョインを実行する際により小さなテーブルをハッシュできるようになった。
- 並列ハッシュジョイン: PostgreSQL 16 は FULL および RIGHT 結合型に対する並列ハッシュジョインをサポートする。
- ウィンドウ関数の最適化: PostgreSQL 16 は、ROWS モードを使う際に RANGE モードより高速なウィンドウ関数を使用できるようにする。
- 常に増加するウィンドウ関数の最適化: PostgreSQL 16 は、ntile()、cume_dist()、percent_rank() などのウィンドウ関数に対する最適化を拡張する。
- パーティションテーブルでの結合削除: PostgreSQL 16 は、パーティションテーブルで LEFT JOIN 削除最適化を許可する。
- DISTINCT クエリに対する Limit の利用: PostgreSQL 16 のクエリプランナーは、すべての行が同じ値を含んでいることを検出できる場合、結果の重複排除のための計画ノードを含めない。
- Merge Join に対するルール緩和: PostgreSQL 16 のクエリプランナーは、Merge Join を検討する際に行の順序が完全に一致していることではなく、少なくとも 1 つの先行列が正しくソートされているかを確認する。
GN⁺の見解
- PostgreSQL 16 のクエリプランナー改善は、データベース性能の向上に重要な役割を果たす。特に増分ソートやメモ化のような機能は、複雑なクエリをより効率的に実行できるようにしてくれる。
- これらの改善点は、PostgreSQL を使う開発者やデータベース管理者にとって非常に有用であり、特に大規模データを扱うシステムでは性能向上を実感できるだろう。
- PostgreSQL コミュニティの継続的な革新と改善への取り組みは、オープンソースデータベース技術の発展を牽引しており、これはユーザーや企業により優れたデータ管理ソリューションを提供する。
1件のコメント
Hacker Newsの意見
explain.dalibo.comとwww.pgexplain.devを使っているユーザーがいる。両ツールとも似たような出力結果を提供する。CREATE INDICES FOR <sql>コマンドで必要なインデックスを作成できる。開発や対話的利用のための自動インデックス生成モードも提案されている。IS NOT DISTINCT FROMクエリを高速化するためにインデックスを使えるようになるのはいつなのか、という質問がある。