-
2025-12-20 PostgreSQLPostgreSQL ナレッジPostgreSQL パラメータ
PostgreSQL 18 で、プランナメソッド設定パラメータの挙動に変更がありました。
はじめに
PostgreSQL では enable_indexscan、enable_seqscan、enable_bitmapscan などのパラメータで、Seq Scan などの特定のアクセスパスを意図的に選択されないように制御できます。
※ 公式ドキュメントなどで「プランナメソッド設定パラメータ」という用語を定義されているわけではありませんが、本記事では便宜上、これらのパラメータを「プランナメソッド設定パラメータ」と呼称します。
これらはパフォーマンスチューニングなどに利用されることが多いのですが、PostgreSQL 18 で挙動が変更されました。
PostgreSQL 17 以前のバージョンでは、これらの設定をオフにすると、内部的には「コスト値を極端に増大させ、実質的に選ばれなくする」という動作をしていました。
PostgreSQL 18 以降では、コスト操作による擬似的な抑止ではなく、プランナの探索段階で該当プランを内部的に除外するようになりました。
実際に検証
では実際に動作させて挙動を確認します。
具体的には、enable_seqscan を off にした状態で、pgbench のテーブルを全件スキャンする SELECT 文を実行し、その実行計画を比較しました。
環境
検証に利用した環境は以下となります。
- Rocky Linux 9.6
- PostgreSQL 18.0
- PostgreSQL 17.6
検証に利用した SQL
実行する SQL は下記のような pgbench_accounts テーブルを全件スキャンするものです。
Seq Scan 以外では pgbench_accounts テーブルを読み込めないため、enable_seqscan = off の状態でも Seq Scan が行われます。
SELECT * FROM pgbench_accounts;
v17 の実行計画
PostgreSQL 17.6 での実行計画は下記となります。
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------
Seq Scan on pgbench_accounts (cost=10000000000.00..10000013197.00 rows=500000 width=97) (actual time=0.006..83.155 rows=500000 loops=1)
Buffers: shared hit=8197
Planning Time: 0.035 ms
Execution Time: 140.060 ms
(4 rows)
enable_seqscan が off になっているので、Seq Scan のコスト値が 10000000000 という非常に大きな値になっています。
v18 の実行計画
PostgreSQL 18.0 での実行計画は下記となります。
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
Seq Scan on pgbench_accounts (cost=0.00..13197.00 rows=500000 width=97) (actual time=0.005..75.813 rows=500000.00 loops=1)
Disabled: true
Buffers: shared hit=8197
Planning Time: 0.027 ms
Execution Time: 130.156 ms
(5 rows)
PostgreSQL 18 では、通常通りのコスト値で実行計画が作成されています。
v17 の実行計画と比較すると「Disabled: true」という出力があります。
これは enable_<アクセスパス> パラメータが off だけれども、その<アクセスパス>が選択された場合に出力されるものです。
上記では enable_seqscan が off だけれども、Seq Scan が行われているため、出力されています。
まとめ
今回の検証から、PostgreSQL 18 では、プランなメソッド設定パラメータを off にした際の仕様が、「コスト値を極端に引き上げて選ばれにくくする」という擬似的な仕組みではなく、「内部的に除外する処理」へ変更されたことを確認できました。
この変更は、実行速度や処理の結果に直接影響する仕様変更ではありませんが、パラメータによって「無効化する」という制御の結果が理解しやすくなりました。
小さな変更ではありますが、プランナの動作が整理され、より一貫性のある仕様になったと感じます。