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

时间:2013-01-14 10:15:13

标签: java sql database random h2

我的数据库中有一个大表(可能有数百万条记录),我需要选择#X随机行(假设#X在10到50之间),但我需要这个查询尽可能最佳。< / p>

表格如下:

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查询执行此任务,那将是非常棒的。

有更好的建议吗?

4 个答案:

答案 0 :(得分:2)

您应该使用列id而不是rowid。您的表格中存在idauto_increment

答案 1 :(得分: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 :(得分:0)

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

答案 3 :(得分:0)

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

&#34;单一查询方式这样做&#34;

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

从表中选择最大身份值。

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

然后从标识值在标识临时表中的表中选择。