Postgtres查询未使用索引

时间:2017-06-22 09:37:34

标签: postgresql

今天我遇到了一个奇怪的问题。我在postgres中有一个大表(表T),它有很多列(col1..col100),我有索引I1(col2,col3,col4)。

现在

explain select col2,col3 from T;

显示表的seq扫描,而不是使用索引。我认为它应该像Index only scan一样,因为我们正在选择索引中的列。

可能是什么原因?

2 个答案:

答案 0 :(得分:0)

首先阅读并分析。我认为这可能会有所帮助。

https://robots.thoughtbot.com/why-postgres-wont-always-use-an-index

答案 1 :(得分:0)

如果SELECT返回超过大约5-10%(取决于配置设置和数据的存储。它不是硬数字)表中的所有行,顺序扫描很多比索引扫描更快。

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

对于其他DBMS也是如此 - 一些优化作为"仅索引扫描"抛开(但对于SELECT *来说,这样的DBMS非常不可能只进行"索引扫描")