多列索引和ORDER BY

时间:2018-08-27 06:00:40

标签: postgresql indexing sql-order-by

PostgreSQL documentation指出,如果我们在索引为... ORDER BY x ASC, y DESC的表上运行查询... (x ASC, y ASC),则由于方向不匹配而无法使用索引。

  1. 这是否意味着该索引完全没有用,或者数据库引擎可以使用索引对x ASC部分进行排序(然后手动对y DESC部分进行排序)?
  2. 如果我们运行查询... WHERE x = 999 ORDER BY y DESC,可以使用该索引怎么办?

1 个答案:

答案 0 :(得分:3)

1。

,该索引无法使用,就像手册中建议的那样。您可以通过在任何表上创建这样的索引来进行验证,然后仅针对测试会话:

SET enable_seqscan = OFF;

然后:

EXPLAIN
SELECT * FROM tbl ORDER BY ORDER BY x, y DESC;

现在,如果可以以任何方式使用索引,那就可以了。但是您仍然会看到顺序扫描。

有一个待实现的补丁程序可实现“增量排序”,但尚不存在。参见:

特殊情况的例外:如果可能使用index-only scan,则如果索引比表小得多,则仍可以使用该索引。但是必须从头开始对行进行排序。

相关:

2。

,索引非常合适。

(即使索引具有y ASC,它也可以工作。可以向后扫描。在这种情况下,仅放置NULL是不利的。)

当然,如果x = 999是一个稳定的谓词(我们一直对999感兴趣)并且多于几行具有不同的x,则{{3} }效率更高:

CREATE INDEX ON tbl (y DESC) WHERE x = 999;

db <>提琴partial index