Java 从H2数据库的大表中选择随机行
我的数据库中有一个很大的表,可能有数百万条记录,我需要选择X个随机行,比如说X在10到50之间,但是我需要这个查询尽可能地优化 该表如下所示:Java 从H2数据库的大表中选择随机行,java,sql,database,random,h2,Java,Sql,Database,Random,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() li
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.
我四处搜索,找到了如下答案:
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个随机整数,然后从rowid所在的示例中选择*。不过,H2中缺少rowid概念,所以我可以选择在表中使用ID列
如果我能用一个SQL查询完成这项任务,那就太棒了
有更好的建议吗?您应该使用列id而不是rowid。列id存在于表中,并且是自动递增的。下面的脚本非常有效地选择每N行。它假定ID中没有间隙。如果可能存在间隙,那么您可能希望将范围1100增加到范围1200左右。要获得随机行,需要稍微更改最后的公式:
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);
您可以对表进行排序,并从中随机选择50个列,避免以任何方式进行排序或分组以保持其优化。为此,我要做的是创建一个临时表。生成从1到表中最大标识值的随机数。然后从临时表中标识值所在的表中进行选择 实现这一点的单一查询方法 创建临时表我不知道h2语法,但它支持字段名为DesiredIdentity的临时表 从表中选择最大标识值 使用rand命令循环,将随机数从1插入临时表中,插入到所需的随机行数。将随机范围设置为从1到最大行数。确保未选择相同的随机数 然后从identity temp表中标识值所在的表中进行选择。H2不支持行ID select _rowid UFROM sample,与SQLite相同。但是使用ID列可以处理所有数据库,因此这是首选的解决方案。