加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – 多列索引和ORDER BY

发布时间:2020-12-13 18:10:50 所属栏目:百科 来源:网络整理
导读:PostgreSQL documentation指出,如果我们运行查询… ORDER BY x ASC,y DESC在具有索引…(x ASC,y ASC)的表上,则由于路线不匹配而无法使用索引. 这是否意味着此索引完全无用,或者数据库引擎是否可以使用索引来订购x ASC部件(然后手动对y DESC部件进行排序)?
PostgreSQL documentation指出,如果我们运行查询… ORDER BY x ASC,y DESC在具有索引…(x ASC,y ASC)的表上,则由于路线不匹配而无法使用索引.

>这是否意味着此索引完全无用,或者数据库引擎是否可以使用索引来订购x ASC部件(然后手动对y DESC部件进行排序)?
>如果我们运行查询… WHERE x = 999 ORDER BY y DESC,可以使用此索引吗?

1.

不,像手册所示,不能使用索引.您可以通过在任何表上创建此类索引进行验证,然后仅针对测试会话进行验证:

SET enable_seqscan = OFF;

然后:

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

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

有一个挂起的补丁来实现“增量排序”,但它还没有.看到:

> https://wiki.postgresql.org/wiki/Postgres_Professional_roadmap#Incremental_sort
> https://www.postgresql.org/message-id/flat/CAPpHfds1waRZ%3DNOmueYq0sx1ZSCnt%2B5QJvizT8ndT2%3DetZEeAQ%40mail.gmail.com

拐角情况例外:如果可以使用index-only scan,如果索引远小于表格,则可能仍会使用该索引.但行必须从头开始排序.

有关:

> Optimizing queries on a range of timestamps (two columns)

2.

是的,指数非常合适.

(即使索引具有y ASC,也可以工作.它可以向后扫描.在这种情况下,只有NULL放置是一个缺点.)

当然,如果x = 999是一个稳定的谓词(它总是999我们感兴趣)并且不止几行有不同的x,那么partial index会更有效:

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

db<>小提琴here

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读