PostgreSQL
documentation指出,如果我们在索引为... ORDER BY x ASC, y DESC
的表上运行查询... (x ASC, y ASC)
,则由于方向不匹配而无法使用索引。
x ASC
部分进行排序(然后手动对y DESC
部分进行排序)?... WHERE x = 999 ORDER BY y DESC
,可以使用该索引怎么办?答案 0 :(得分:3)
否,该索引无法使用,就像手册中建议的那样。您可以通过在任何表上创建这样的索引来进行验证,然后仅针对测试会话:
SET enable_seqscan = OFF;
然后:
EXPLAIN
SELECT * FROM tbl ORDER BY ORDER BY x, y DESC;
现在,如果可以以任何方式使用索引,那就可以了。但是您仍然会看到顺序扫描。
有一个待实现的补丁程序可实现“增量排序”,但尚不存在。参见:
特殊情况的例外:如果可能使用index-only scan,则如果索引比表小得多,则仍可以使用该索引。但是必须从头开始对行进行排序。
相关:
是,索引非常合适。
(即使索引具有y ASC
,它也可以工作。可以向后扫描。在这种情况下,仅放置NULL
是不利的。)
当然,如果x = 999
是一个稳定的谓词(我们一直对999
感兴趣)并且多于几行具有不同的x
,则{{3} }效率更高:
CREATE INDEX ON tbl (y DESC) WHERE x = 999;
db <>提琴partial index