【发布时间】:2017-03-14 21:20:08
【问题描述】:
我有一个大表(大约 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 文档并说在带有LIMIT 子句的ORDER BY 的特殊情况下,使用索引而不是扫描表更有效,因为排序需要扫描完整的表只是为了得到一个项目
Postgres 不应该检测到 nulls last / first 无关紧要,因为该列不接受空值并且只使用最快的方法吗?
【问题讨论】:
-
如果您知道您的
DATE列是NOT NULL,为什么还要指定NULLS LAST? -
因为我注意到索引扫描使用条件
DATE IS NOT NULL,所以我把NULLS LAST认为postgre 正在检查该条件,因为当以降序排序时,第一个元素被认为是可能为空 -
请edit您的问题并添加使用
explain (analyze, verbose)生成的执行计划。 Formatted 文本 请no screen shots
标签: postgresql indexing sql-order-by