【问题标题】:What is the performance of arbitrary ordering in PostgreSQL?PostgreSQL 中任意排序的性能如何?
【发布时间】:2015-03-20 19:59:07
【问题描述】:

在 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),我们天真地做一个 indexof 排序,像这样:

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

【问题讨论】:

  • "psql" 是命令行界面的名称,不是 Postgres 的有效名称。
  • 通过测试似乎很容易确定。

标签: algorithm postgresql sorting sql-order-by


【解决方案1】:

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;

详情:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2019-07-14
    相关资源
    最近更新 更多