我有一张大桌子(大约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 BY
带LIMIT
子句的特殊情况下使用索引而不是扫描表格会更有效率,因为排序需要扫描整个表只是为了获得单个项目
Postgres不应该检测到nulls last / first
无关紧要,因为该列不接受空值并且只使用最快的方法吗?
答案 0 :(得分:0)
总是需要权衡,因为让优化器更智能也意味着让优化器更慢,这会伤害每个人。
目前,它不够智能,因此您必须更改索引定义或查询才能使其正常工作。
可能值得在pgsql-hackers邮件列表上寻求这样的改进,或者自己编写补丁并在那里提交。
答案 1 :(得分:0)
因为您正在使用该查询执行“ SELECT ALL ROWS”。 Postgres不会使用索引。
我敢打赌,如果您添加“ WHERE date =?”条件,将使用索引。