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

标签 algorithm postgresql sorting sql-order-by

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

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 n),我们天真地做了一个索引排序:

data.sort(function(a, b) {
    return indexOf(a) < indexOf(b);
});

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

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

Postgres 使用什么算法,性能如何?如果它优于 O((log n) * the_sort_algorithms_performance),我们将在 db 之外实现排序。或者,如果算法是我们可以轻松移植到 Java 的算法,我们可能仍然不会在 Postgres 中进行排序。

最佳答案

TLDR;不详细讨论您的广泛问题。排序算法是一个复杂的领域。

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

SELECT t.*
FROM   unnest('{8, 6, 7, 5, 10, 24}'::int[]) id
JOIN   mytable t USING (id);

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

SELECT *
FROM   unnest('{8, 6, 7, 5, 10, 24}'::int[]) WITH ORDINALITY x(id, rn)
JOIN   mytable t USING (id)
ORDER  BY x.rn;

详细信息:

关于algorithm - PostgreSQL 中任意排序的性能如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29174882/

相关文章:

php - PHP 的加权搜索算法

sql - TRUNCATE 是 DML 语句吗?

javascript - 在 Javascripts 中对非英文名称进行排序

java - java无效归并排序方法

algorithm - 有人可以帮我做算法作业吗?

c++ - 遍历层树的复杂性

algorithm - 从前序和后序遍历构建树

postgresql - 输入不是 UTF-8 编码

database - Postgresql:在多对多关系中使用数组而不是额外的表?

c++ - O(NlogN) 算法运行速度比 O(n) 快...等等,什么?