从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到最大行数。 确保未选择相同的随机数。

然后从身份临时表中标识值的表中进行选择。