하루에 0.01%라도 성장하자

Develop/Database

SQL - 여러개의 로우 중 랜덤하게 로우를 가져오는 방법

뚠님 2022. 1. 12. 09:42
반응형

최근에 본의아니게 SQL을 가지고 열심히 씨름중인데..

 

이번에 랜덤하게 row를 가져와서 사용할 일이 생겼다..

 

5만개 조금 넘어가는 row 였는데, 다른 블로그에서 가이드 준 대로 진행하보니 뭔가 문제가 있어 보였다.

 

SELECT * FROM TEST ORDER BY RAND() LIMIT 10

먼저 TEST 라는 테이블에서 랜덤한 로우를 10개 가져오는 것인데, 

 

위 쿼리로 하게되면 엄청나게 시간이 오래 걸린다.. 물론 위에는 내가 TEST로 썼지만, 실제 업무용 테이블은 텍스트가 많아서 그런지 더 그랬고.. 실제로 15초 이상이 걸렸다.

 

해당 문제는 단순하게 * 이 아니라 특정 컬럼을 하나 지정하면 바로 수정되긴 하더라.. 아마 텍스트가 엄청 나게 많았던 컬럼 때문에 그런거 같은 느낌..

 

SELECT TEST_COL FROM TEST ORDER BY RAND() LIMIT 10

위 쿼리처럼 특정 컬럼으로만 조회하면 문제가 되진 않더라..

 

 

여기서 사람들이 한번 더 성능적인 측면을 고려하여 쿼리를 짜던데.. 커버링 인덱스라고 하더라

( 자세한 내용은 여기에 잘 설명되어 있어서 링크를 남깁니다.!  https://jojoldu.tistory.com/476 )

SELECT A.TEST_COL1, A.TEST_COL2 
FROM TEST AS A
JOIN (
	SELECT DRUG_CD FROM TEST
	WHERE TEST_COL1 IS NOT NULL
	ORDER BY RAND() LIMIT 10) AS B
ON A.TEST_COL1 = B.TEST_COL1

TEST_COL1 이 INDEX 라고 할때 해당 쿼리가 커버링 인덱스를 사용한 쿼리가 된다고 한다...

( 된다고 한다고 표현하는게 맞을 것 같다.. 저도 아직 잘 모르겠는.. )

 

DB 하시는 분들, SQL 하시는 분들 대단합니다...

반응형