从H2数据库中的大表中选择随机行

问题描述 投票:2回答:4

我的数据库中有一个大表(可能有数百万条记录),我需要选择#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 (<random integer list>)。但afaik,在H2中缺少rowid概念,所以我可能会选择在我的表中使用ID列。

如果我可以使用单个SQL查询执行此任务,那将是非常棒的。

有更好的建议吗?

java sql database random h2
4个回答
2
投票

以下脚本非常有效地选择每个第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);

2
投票

您应该使用列id而不是rowid。列id存在于您的表中,是auto_increment


0
投票

您可以对表格进行排名,并从中选择随机50排名,避免以任何方式排序或分组以保持优化。


0
投票

我为此做的是创建临时表。在表中生成从1到最大标识值的随机数。然后从表中选择其标识值在临时表中。

“单一查询方式这样做”

创建临时表(我不知道这个的h2语法,但它支持字段名为DesiredIdentity的临时表)

从表中选择最大标识值。

使用rand命令循环以将随机数插入到临时表中,从1到所需的随机行数。将随机范围设置为1到最大行数。确保未选择相同的随机数。

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

© www.soinside.com 2019 - 2024. All rights reserved.