201

非常に単純な例-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)

代わりにインデックススキャンを実行しないのはなぜですか?私は何が欠けていますか?

4

4 に答える 4

303

SELECT がテーブル内のすべての行の約 5 ~ 10% 以上を返す場合、順次スキャンはインデックス スキャンよりもはるかに高速です。

これは、インデックス スキャンでは行ごとに複数のIO 操作が必要になるためです (インデックスで行を検索し、ヒープから行を取得します)。シーケンシャル スキャンでは、行ごとに 1 つの IO しか必要ありませんが、ディスク上のブロック (ページ) には複数の行が含まれているため、1 回の IO 操作で複数の行をフェッチできるため、さらに少なくなります。

ところで: これは他の DBMS にも当てはまります - 「インデックスのみのスキャン」としての最適化のいくつかは取り除かれます (ただし、SELECT * の場合、そのような DBMS が「インデックスのみのスキャン」になる可能性はほとんどありません)。

于 2011-03-05T12:33:13.530 に答える
17

テーブル/データベースを分析しましたか? そして、統計はどうですか?年が 2009 年を超えるレコードが多数ある場合、インデックス スキャンよりもシーケンシャル スキャンの方が高速である可能性があります。

于 2011-03-05T12:28:20.250 に答える