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

2024-01-08

我的数据库中有一个大表(可能有数百万条记录),我需要选择 #X 随机行(假设 10 到 50 之间的 #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 个随机整数并执行select * from sample where rowid in (<random integer list>)。但据我所知,H2 中缺少 rowid 概念,因此我可能会选择在表中使用 ID 列。

如果我可以使用单个 SQL 查询来完成这项任务,那就太棒了。

有更好的建议吗?


以下脚本非常有效地选择每第 n 行。它假设 ids 中没有间隙。如果可能存在间隙,那么您可能需要将 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 H2 数据库的大表中选择随机行 的相关文章

随机推荐