为什么Postgres没有在简单的ORDER BY LIMIT 1上使用我的索引?

时间:2016-11-01 17:12:50

标签: postgresql indexing sql-order-by

我有一张大桌子(大约11,000,000行),我需要找到第一个给出排序条件的项目。

请注意,列Date执行 NOT 接受空值

为什么Postgres不使用索引:

CREATE INDEX track_ix_date
  ON "Track"
  USING btree
  ("Date" DESC NULLS LAST);

在这个简单的查询中:

select * from "Track" order by "Date" desc limit 1

但它确实在其他查询中使用它:

select * from "Track" order by "Date" desc nulls last limit 1

第二个查询实际上比第一个查询快得多。

我已阅读indexes and ORDER BY文档,并说在ORDER BYLIMIT子句的特殊情况下使用索引而不是扫描表格会更有效率,因为排序需要扫描整个表只是为了获得单个项目

Postgres不应该检测到nulls last / first无关紧要,因为该列不接受空值并且只使用最快的方法吗?

2 个答案:

答案 0 :(得分:0)

总是需要权衡,因为让优化器更智能也意味着让优化器更慢,这会伤害每个人。

目前,它不够智能,因此您必须更改索引定义或查询才能使其正常工作。

可能值得在pgsql-hackers邮件列表上寻求这样的改进,或者自己编写补丁并在那里提交。

答案 1 :(得分:0)

因为您正在使用该查询执行“ SELECT ALL ROWS”。 Postgres不会使用索引。

我敢打赌,如果您添加“ WHERE date =?”条件,将使用索引。