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

zmeyuzjn  于 2023-02-21  发布在  Java
关注(0)|答案(5)|浏览(197)

我的数据库中有一个很大的表(可能有数百万条记录),我需要选择#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>),但是H2中缺少afaik,rowid的概念,所以我可以选择使用表中的ID列。
如果我能用一个SQL查询完成这个任务,那就太棒了。
有更好的建议吗?

a11xaf1n

a11xaf1n1#

下面的脚本非常有效地选择了每隔n行。它假设id中没有间隔。如果间隔是可能的,那么您可能需要将range(1,100)增加到range(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);
hs1ihplo

hs1ihplo2#

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

xsuvu9jc

xsuvu9jc3#

您可以排名您的表,并选择随机50排名出来,避免排序或分组以任何方式保持它的优化。

uajslkp6

uajslkp64#

我所做的就是创建一个临时表。在表中生成从1到最大标识值的随机数。然后从临时表中标识值所在的表中选择。
“执行此操作的单一查询方式”
创建临时表(我不知道h2语法,但它支持字段名为DesiredIdentity的临时表)
从表中选择最大标识值。
使用兰德命令循环执行,将随机数插入临时表中,范围从1到所需的随机行数。将随机数的范围设置为从1到最大行数。确保未选择相同的随机数。
然后从标识临时表中标识值所在的表中进行选择。

cs7cruho

cs7cruho5#

我使用以下方法:

  1. SELECT COUNT(*) FROM TABLE1...然后计算从1到COUNT(包括1和COUNT)的随机值
  2. SELECT * FROM (SELECT ROWNUM() AS NUM, ID AS ID FROM TABLE1) AS T1 WHERE T1.NUM =随机值

相关问题