Algorithm PostgreSQL中任意排序的性能如何?
在Postgres中,可以执行这样的命令Algorithm PostgreSQL中任意排序的性能如何?,algorithm,postgresql,sorting,sql-order-by,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(logn),我们天真地做了如下索引排序: data.sort(function(a, b) { return indexOf
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(logn),我们天真地做了如下索引排序:
data.sort(function(a, b) {
return indexOf(a) < indexOf(b);
});
data.sort(函数(a,b){
返回索引of(a)
然后我们每个排序操作可能需要O(2n),使我们的总算法时间变成O(n logn)
然后,我们可以创建一个简单的位置值索引,而不是每次都使用。假设这也有一个最坏的时间O(logn),那么对于我们的排序算法,我们得到O((logn)(logn))或O((logn)^2)。对于一个算法来说,这不是很好的性能
Postgres使用什么算法,什么性能?如果它优于O((logn)*排序算法性能),我们将在数据库之外实现排序。或者,如果算法很容易移植到Java,我们可能仍然无法在Postgres中进行排序。TLDR;不要详细讨论你的大问题。排序算法是一个复杂的领域 至于您的查询:如果您提供一个值列表,这可能会便宜得多,因为您必须以某种顺序传递值: 这是可行的,但没有保证。可以肯定的是(在9.4+的Postgres中): 详情:
SELECT t.*
FROM unnest('{8, 6, 7, 5, 10, 24}'::int[]) id
JOIN mytable t USING (id);
SELECT *
FROM unnest('{8, 6, 7, 5, 10, 24}'::int[]) WITH ORDINALITY x(id, rn)
JOIN mytable t USING (id)
ORDER BY x.rn;