我在 postgres 中有一个包含几百万行的表。我在网上查了一下,发现了以下内容
SELECT myid FROM mytable ORDER BY RANDOM() LIMIT 1;
它有效,但它真的很慢......是否有另一种方法来进行该查询,或者一种直接选择随机行而不读取所有表的方法?顺便说一下,'myid' 是一个整数,但它可以是一个空字段。
最佳答案
您可能想尝试使用 OFFSET
,如SELECT myid FROM mytable OFFSET floor(random()*N) LIMIT 1;
N
是 mytable
中的行数。您可能需要先执行 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/