【问题标题】:Faster order by rand() while don't have an ID在没有 ID 的情况下通过 rand() 更快地订购
【发布时间】:2021-02-07 12:31:34
【问题描述】:

我正在使用 postgresql 12.1 来执行该任务。

我有一个名为 numbers 的表和一个名为 number_a 的相关列,该表没有自动递增的主键。

我需要从中获取随机数,问题是这个表非常大,可能接近 1b 行。所以即使我随机选择一行也需要很长时间。

执行select number_1 from numbers order by random() limit 1真的很慢

我在 Google 上搜索并找到了一些网站,这些网站解释说您可以使用增量 ID 来查找随机键,但我在此表中没有它,我无法修改它。

我在 google 上搜索了一些,发现了一些 postgresql 扩展,但我不想仅仅为了这种解决方案而安装 3rd 方扩展。

那么当我没有增量键时,无论如何知道如何通过 rand 正确选择?

我不能换桌子。

【问题讨论】:

  • 不确定它是否“足够随机”,但您尝试过tablesample吗?
  • @a_horse_with_no_name - YAAAYAYAYAYY!将其发布为答案:) 使用与 postgresql 捆绑在一起的 tsm_system_rows。很快!谢谢

标签: postgresql random sql-order-by


【解决方案1】:

来自评论:

不确定它是否“足够随机”,但您尝试过tablesample 吗? – a_horse_with_no_name

【讨论】:

    【解决方案2】:

    我只是想提供更多关于正确答案的信息。

    Postgresql 支持tablesample,它提供随机结果集。对于我的需要,它足够随机。我检查过,每次我得到不同的结果集。这对我来说已经足够了。

    现在,tablesample 支持更多与百分比相关而不与实际行相关的 SYSTEM 和 BERNOULLI 采样方法。

    postgres(不是 3rd 方或任何东西)附带了一个扩展,它支持特定的行号 https://www.postgresql.org/docs/current/tsm-system-rows.html

    所以我可以轻松做到:

    CREATE EXTENSION tsm_system_rows;
    select number_a from numbers tablesample system_rows(4);
    

    这将运行。非常非常快:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      相关资源
      最近更新 更多