非常简单的示例-一个表,一个索引,一个查询: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不太可能会进行“仅索引扫描”)
回首忆惘然
TA贡献1847条经验 获得超11个赞
在索引扫描中,读取头从一行跳到另一行,这比读取下一个物理块要慢1000倍(在顺序扫描中)。
因此,如果(要检索的记录数* 1000)小于记录总数,则索引扫描会更好。
- 3 回答
- 0 关注
- 734 浏览
添加回答
举报
0/150
提交
取消