我在 postgres 中有一个包含几百万行的表。我在网上查了一下,发现了以下内容

SELECT myid FROM mytable ORDER BY RANDOM() LIMIT 1;

它有效,但它真的很慢......是否有另一种方法来进行该查询,或者一种直接选择随机行而不读取所有表的方法?顺便说一下,'myid' 是一个整数,但它可以是一个空字段。

最佳答案

您可能想尝试使用 OFFSET ,如
SELECT myid FROM mytable OFFSET floor(random()*N) LIMIT 1;Nmytable 中的行数。您可能需要先执行 SELECT COUNT(*) 来计算 N 的值。

更新 (安东尼·哈奇金斯)

您必须在此处使用 floor:

SELECT myid FROM mytable OFFSET floor(random()*N) LIMIT 1;

考虑一个 2 行的表格; random()*N 生成 0 <= x < 2,例如 SELECT myid FROM mytable OFFSET 1.7 LIMIT 1; 返回 0 行,因为隐式舍入到最近的整数。

关于postgresql - Postgres 中的快速随机行选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5297396/

10-15 18:42