2013-01-14 4 views
2

데이터베이스 (잠재적으로 수백만 개의 레코드)에 큰 테이블이 있는데 #X 무작위 행 (10-50 사이의 #X라고 가정 해 봅시다)이 필요합니다. 이 쿼리는 가능한 한 최적이되어야합니다.H2 데이터베이스의 큰 테이블에서 임의의 행 선택

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, rowid 개념은 H2에 없으므로 테이블에서 ID 열을 사용하도록 선택할 수 있습니다.

단일 SQL 쿼리로이 작업을 수행 할 수 있다면 정말 좋을 것입니다.

더 나은 조언이 있으십니까?

+1

H2는 행 ID를 지원합니다 ('select _rowid_ from sample', SQLite와 동일). 그러나 ID 열을 사용하면 모든 데이터베이스에서 작동하므로 선호되는 솔루션입니다. –

답변

2

다음 스크립트는 모든 n 번째 행을 매우 효율적으로 선택합니다. ID에 간격이 없다고 가정합니다. 간격이 가능하면 범위 (1, 100)에서 범위 (1, 200) 정도로 늘릴 수 있습니다. 당신은 정렬하거나 유지하기 위해 어떤 방법으로 그룹화 피, 테이블 순위 및 그것에서 임의의 50 개 계급을 선택할 수 있습니다

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

rowid 대신 id 열을 사용해야합니다. 테이블에 열 id이 있고 auto_increment입니다.

0

: 임의의 행을 얻으려면, 맨 끝의 공식은 변경 될 조금 필요 최적화.

+1

이것을 달성하기 위해 몇 가지 예제 SQL을 보여줄 수 있습니까? –

0

내가 수행하는 작업은 임시 테이블을 만드는 것입니다. 테이블에서 1부터 최대 ID 값까지 난수를 생성하십시오. 그런 다음 ID 값이 임시 테이블에있는 테이블에서 선택하십시오.

만들기 임시 테이블 "이 일의 단일 쿼리 방법"(나는이에 대한 H2 구문을 모르는 그러나 DesiredIdentity의 필드 이름으로 임시 테이블을 지원)

하는 최대 ID 값을 선택 테이블에서.

임시 테이블에 임의의 숫자를 1에서 원하는 임의의 행 수로 삽입하려면 rand 명령을 반복합니다. 무작위의 범위를 1에서 최대 행 수로 설정합니다. 동일한 난수가 선택되지 않도록하십시오.

그런 다음 ID 값이 ID 임시 테이블에있는 테이블에서 선택하십시오.

관련 문제