PostgreSQL为什么对索引列执行顺序扫描?

非常简单的示例-一个表,一个索引,一个查询:


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)

为什么不执行索引扫描呢?我想念什么?


开满天机
浏览 735回答 3
3回答

繁星点点滴滴

如果SELECT返回表中所有行的大约5-10%,则顺序扫描比索引扫描快得多。这是因为索引扫描需要为每一行执行多个 IO操作(在索引中查找该行,然后从堆中检索该行)。顺序扫描每行仅需要一个IO-甚至更少,因为磁盘上的一个块(页面)包含多于一行,因此可以通过单个IO操作来获取多于一行。顺便说一句:其他DBMS也是如此-保留了一些优化功能,例如“仅索引扫描”(但是对于SELECT *,这种DBMS不太可能会进行“仅索引扫描”)

慕田峪4524236

您是否分析了表/数据库?那统计呢?如果有很多记录,年份> 2009,则顺序扫描可能比索引扫描更快。

回首忆惘然

在索引扫描中,读取头从一行跳到另一行,这比读取下一个物理块要慢1000倍(在顺序扫描中)。因此,如果(要检索的记录数* 1000)小于记录总数,则索引扫描会更好。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server