【问题标题】:Efficient top K PostgreSQL高效top K PostgreSQL
【发布时间】:2018-05-13 02:10:00
【问题描述】:

我在 PostgreSQL 中有一个巨大的表,我需要获取前 K 个元素。 有没有办法在 O(N logK) 中选择前 K 个条目?
最明显的例子:

SELECT *
FROM table
ORDER BY col
LIMIT k

会给我们类似的 O(N logN) 解决方案

sorted(arr)[:k] # in python

有没有使用堆的 SQL 方法?
就像这个例子:

from heapq import nsmallest
nsmallest(k, arr)

使用最小堆的 O(N logK) 是多少?

【问题讨论】:

  • 我不知道在 PostgreSQL 中表达这一点的方法。但是,如果您事先在 col 上创建一个 INDEX,那么您将基本上免费获得 ORDER BY,运行时间仅为 O(k)。当然,这只有在您有大量包含 col 的相同形式的查询时才有意义。
  • 问题是存在浮动列,我们可以添加任意数量的行(我们可以添加值低于或高于当前最小/最大元素的行)
  • 对不起,我不明白。您可以在具有浮点(数字)值的列上创建索引(例如,btree)。当您插入新行时,索引将负责排序(缺点是插入成本略高)。

标签: python algorithm postgresql sorting heap


【解决方案1】:

事先在列上创建索引(例如,btree)将显着加快该列上的 ORDER BY。在插入期间,您将获得一些开销,但如果您在指定列上有大量相同形式的查询,这将得到回报。我在this page(在“使用索引进行排序”下)上找到了关于您所要求的查询的有趣信息/实验

【讨论】:

    猜你喜欢
    • 2019-10-09
    • 2016-05-27
    • 1970-01-01
    • 2021-02-21
    • 2022-01-15
    • 2016-08-23
    • 1970-01-01
    • 2012-11-19
    • 2019-09-20
    相关资源
    最近更新 更多