从H2数据库中的大表中选择随机行
我的数据库中有一个大表(可能有数百万条记录),我需要选择#X随机行(假设#X在10到50之间),但我需要这个查询尽可能最佳。
该表如下所示:
CREATE TABLE sample ( id bigint auto_increment PRIMARY KEY, user_id bigint NOT NULL, screen_name VARCHAR NOT NULL, ... );
我四处搜寻,发现这样的答案:
SELECT * FROM sample ORDER BY RAND() limit X.
但它在我看来,这将获取整个表然后排序,不是吗?
我认为最好生成10或50个随机整数,然后select * from sample where rowid in ()
。 但afaik,在H2中缺少rowid概念,所以我可以选择在我的表中使用ID列。
如果我可以使用单个SQL查询执行此任务,那将是非常棒的。
有什么好建议吗?
以下脚本非常有效地选择每个第n行。 它假设ID中没有间隙。 如果可能存在间隙,则可能需要将范围(1,100)增加到范围(1,200)左右。 要获得随机行,最后的公式需要稍微更改一下:
drop table test; create table test( id bigint auto_increment primary key, name varchar(255)); insert into test select x, 'Hello ' || x from system_range(50, 1200); select * from test t, system_range(1, 100) range where t.id = x * (select max(id)-min(id) from test) / 100 + (select min(id) from test);
您应该使用列id
而不是rowid
。 列id
存在于表中,并且是auto_increment
。
您可以对表格进行排名并从中选择随机50排名,避免以任何方式排序或分组以保持优化。
我为此做的是创建临时表。 在表中生成从1到最大标识值的随机数。 然后从表中选择其标识值在临时表中。
“单一查询方式这样做”
创建临时表(我不知道这个的h2语法,但它支持字段名为DesiredIdentity的临时表)
从表中选择最大标识值。
使用rand命令循环以将随机数插入到临时表中,从1到您想要的随机行数。 将随机范围设置为1到最大行数。 确保未选择相同的随机数。
然后从身份临时表中标识值的表中进行选择。