Postgtres查询未使用索引列索引

问题描述:

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

现在

explain select col2,col3 from T; 

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

可能是什么原因?

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

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

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

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

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