为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

开满天机 2019-11-12 10:49:14
非常简单的示例-一个表,一个索引,一个查询: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)为什么不执行索引扫描呢?我想念什么?
查看完整描述

3 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

如果SELECT返回表中所有行的大约5-10%,则顺序扫描比索引扫描快得多。

这是因为索引扫描需要为每一行执行多个 IO操作(在索引中查找该行,然后从堆中检索该行)。顺序扫描每行仅需要一个IO-甚至更少,因为磁盘上的一个块(页面)包含多于一行,因此可以通过单个IO操作来获取多于一行。

顺便说一句:其他DBMS也是如此-保留了一些优化功能,例如“仅索引扫描”(但是对于SELECT *,这种DBMS不太可能会进行“仅索引扫描”)


查看完整回答
反对 回复 2019-11-12
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-11-12
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

在索引扫描中,读取头从一行跳到另一行,这比读取下一个物理块要慢1000倍(在顺序扫描中)。


因此,如果(要检索的记录数* 1000)小于记录总数,则索引扫描会更好。


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 699 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信