2017-06-22 66 views
0

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

现在

explain select col2,col3 from T; 

显示SEQ扫描的表,而不是使用索引。我认为它应该像索引只扫描,因为我们正在选择索引中的列。

可能是什么原因?

回答

0

如果SELECT返回比约5-10%以上(取决于配置设置和数据的存储。这不是一个很难数)的所有行的表中,按顺序进行扫描比索引扫描快得多。

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

对于其他DBMS也是如此 - 一些优化被视为“仅索引扫描”(但对于SELECT *,这是非常不可能的,这样的DBMS将用于“仅索引扫描”)