Postgres不使用带有“ORDER BY”的索引

时间:2010-11-19 16:47:48

标签: postgresql indexing sql-order-by limit

  • 我有一张很大的桌子。
  • 我在列col1上有一个索引。
  • 我想通过col1获取数据。
  • 从查询计划中我可以说它不使用索引。
  • 当我添加“LIMIT”时,它开始使用索引
  • 对于“LIMIT”的较大值,它将停止使用索引。

有任何线索吗?

P.S。我想通过col1(不一定排序)的值来获得聚集的数据,除了“ORDER BY”之外的任何建议。

感谢!!

2 个答案:

答案 0 :(得分:6)

如果从表中返回所有行,则索引扫描将比表扫描慢。 为什么你认为你需要使用索引?

您可以尝试使用

set enable_seqscan = false

为了禁用顺序扫描,但我确信它会比顺序扫描慢。

ORDER BY是用于对数据进行排序的唯一方法。您可能会看到的任何其他排序都是纯粹的巧合

修改
要清理:我建议关闭seq扫描。我刚发布这个作为一种方式来表明seq扫描确实比索引扫描更快。一旦关闭,使用索引扫描执行计划将很可能比显示OP的seq扫描更慢,因为不需要索引扫描。

答案 1 :(得分:4)

除了a_horse_with_no_name:

的答案

使用索引实际上是两个不同的操作:首先在索引中查找所需的值。在索引中是完整记录的地址,然后取消引用。对于特定查询,这两种操作都非常快。

如果您打算使用所有或大多数记录,那么收益就会消失。如果你想要所有记录并且你通过索引,则需要更长的时间,因为每个记录都有两个搜索。在没有索引的情况下运行整个表更容易,因为这需要每列一次搜索(是的,我知道,实际上它比那更少,因为读取整个块等等......我只是想保持简单)。