1. ホーム
  2. postgresql

[解決済み】PostgreSQLがインデックス付きカラムに対してシーケンシャルスキャンを実行するのはなぜですか?

2022-04-16 12:36:13

質問

1つのテーブル、1つのインデックス、1つのクエリという非常にシンプルな例です。

CREATE TABLE book
(
  id bigserial NOT NULL,
  "year" integer,
  -- other columns...
);

CREATE INDEX book_year_idx ON book (year)

EXPLAIN
 SELECT *
   FROM book b
  WHERE b.year > 2009

が与えてくれる。

Seq Scan on book b  (cost=0.00..25663.80 rows=105425 width=622)
  Filter: (year > 2009)

なぜインデックススキャンを実行しないのですか? 私は何を見逃しているのでしょうか?

解決方法は?

SELECTがテーブルの全行数の約5-10%以上を返す場合、インデックススキャンよりもシーケンシャルスキャンの方がはるかに高速になります。

これは、インデックススキャンには 各行に対する IO 操作(インデックスで行を検索し、ヒープからその行を取得する)。ディスク上のブロック(ページ)には複数の行が含まれるため、1回のIO操作で複数の行を取得することができるからです。

しかし、SELECT *の場合、そのようなDBMSがquot;インデックスのみのスキャンを行うことはほとんどないでしょう)。