Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从H2数据库的大表中选择随机行_Java_Sql_Database_Random_H2 - Fatal编程技术网

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

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

我的数据库中有一个很大的表,可能有数百万条记录,我需要选择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.
我四处搜索,找到了如下答案:

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列可以处理所有数据库,因此这是首选的解决方案。