用語集のすべての用語

シーケンシャルスキャン

PostgreSQL のシーケンシャルスキャンとは?

シーケンシャルスキャンは、テーブルのすべての行を先頭から末尾まで読み取ります。EXPLAIN では Seq Scan と表示され、小さなテーブルや多くの行を返すクエリでは通常の選択です。

シーケンシャルスキャン(EXPLAIN の出力では Seq Scan)は、テーブルのすべてのページを順番に読み、各行をクエリの条件と照合します。インデックスを必要とせず、使えるインデックスがない場合にオプティマイザが最終的に選ぶ方法です。

Seq Scan だからといって、それ自体が問題とは限りません。小さなテーブルや、クエリが行の大部分を返す場合は、インデックスとテーブルの間を行き来するよりも、テーブル全体を読むほうが低コストになることがあります。問題になるのは、大きなテーブルを全件読んでごく少数の行しか返さない場合で、通常は絞り込み対象の列にインデックスを作成すれば解決します。オプティマイザはテーブルの統計情報に基づいて判断するため、大量のデータをロードした後は ANALYZE を実行してください。

例

この例では 100,000 行をロードし、ANALYZE で統計情報を収集したうえで、インデックスのない列で絞り込む場合に PostgreSQL がどう処理するかを EXPLAIN で確認します。出力には Seq Scan on events と表示されます。

CREATE TABLE events (id int, kind text);
INSERT INTO events
SELECT g, 'k' || (g % 10) FROM generate_series(1, 100000) AS g;
ANALYZE events;

EXPLAIN SELECT * FROM events WHERE kind = 'k3';

拡張機能なしの標準の PostgreSQL 16 または 17 で動くプレーンな SQL です。破棄してかまわない空のデータベースで実行してください。

出典

PostgreSQL 公式ドキュメント(英語)。

関連用語