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

时间:2015-03-20 19:59:07

标签: 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中进行排序。

1 个答案:

答案 0 :(得分:2)

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;

详细说明: