首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PostgreSQL中任意排序的性能如何?

PostgreSQL中任意排序的性能如何?
EN

Stack Overflow用户
提问于 2015-03-21 03:59:07
回答 1查看 362关注 0票数 0

在Postgres中,可以执行这样的命令

代码语言:javascript
代码运行次数:0
运行
复制
SELECT * FROM mytable
WHERE id in (8, 6, 7, 5, 10, 24)
ORDER BY id=8 DESC, id=6 DESC, id=7 DESC, id=5 DESC, id=10 DESC, id=24 DESC;

以任意顺序选择任意数据。

我曾想过,如果某个排序算法有O(log ),而我们天真地做了一个indexof排序,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
data.sort(function(a, b) {
    return indexOf(a) < indexOf(b);
});

然后,我们每次排序操作可能需要O(2n),使我们的总算法时间为O( n )。

然后,我们可以创建一个简单的位置值索引,而不是每次都重新排序。假设这也有O(log )的最坏时间,那么对于我们的排序算法,我们得到O((log )(Log))或O((log )^2)。对于算法来说,这并不是很好的性能。

Postgres使用什么算法,什么性能?如果它比O((log )* the_sort_algorithms_performance)好,我们将在db之外实现排序。或者,如果算法是一种我们可以很容易移植到Java的算法,我们可能仍然不会在Postgres中进行排序。

EN

回答 1

Stack Overflow用户

发布于 2015-03-21 05:25:53

TLDR;你的宽泛的问题不涉及细节。排序算法是一个复杂的领域。

至于您的查询:如果您提供了一个值列表,这可能会更便宜,因为您无论如何都必须按某种顺序传递这些值:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT t.*
FROM   unnest('{8, 6, 7, 5, 10, 24}'::int[]) id
JOIN   mytable t USING (id);

这是可行的,但不能保证。当然(在Postgres 9.4+中):

代码语言:javascript
代码运行次数:0
运行
复制
SELECT *
FROM   unnest('{8, 6, 7, 5, 10, 24}'::int[]) WITH ORDINALITY x(id, rn)
JOIN   mytable t USING (id)
ORDER  BY x.rn;

详细信息:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29174882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档