Postgtres查询未使用索引列索引
问题描述:
今天我遇到了一个奇怪的问题。我在postgres(表T)中有一个大表,它有很多列(col1..col100),我有索引I1(col2,col3,col4)。Postgtres查询未使用索引列索引
现在
explain select col2,col3 from T;
显示SEQ扫描的表,而不是使用索引。我认为它应该像索引只扫描,因为我们正在选择索引中的列。
可能是什么原因?
答
如果SELECT返回比约5-10%以上(取决于配置设置和数据的存储。这不是一个很难数)的所有行的表中,按顺序进行扫描比索引扫描快得多。
索引扫描对每一行都需要多个IO操作(查找索引中的行,然后从堆中检索行)。顺序扫描对每一行只需要一个IO,甚至更少,因为磁盘上的块(页面)包含多个行,因此可以通过单个IO操作获取多行。
对于其他DBMS也是如此 - 一些优化被视为“仅索引扫描”(但对于SELECT *,这是非常不可能的,这样的DBMS将用于“仅索引扫描”)