출처 : http://okjsp.pe.kr/seq/9780



오라클 랜덤하게 row 가져오는 방법은?


특정 테이블에서 조건을 준 결과 값에서 특정 갯수로 램덤하게 로우를 가져오는 방법이 없을까요?
(예 :  "1002405 건에서 10건만 랜덤하게 가져오기" )

제가 해본 것들
(1) 오라클 sample() 함수 이용
   --> 문제점 : 위의 예와 같은 경우 리턴 갯수를 정확하게 맞출 수가 없습니다.


(2) dbms_random.value 을 이용하는 방법
   --> 문제점 : 속도가 느림


(3) 조건절에 IN 을 주고 (3,6,7) 는 자바에서 랜덤하게 숫자 만들어 스트링으로 바꿔서 쿼리를 만드는 방법
   SELECT rownum, id, name
   FROM A
   WHERE rownum IN (3,6,7)
   --> 문제점 : 수행속도가 (2)번 방법보다는 빠르나 sample()함수를 쓰는 것 보다는 속도가 현저히 느림


 

(1) 방법은 속도는 빠르나 리턴갯수를 정확하게 맞춰서 가져올 수 없는 문제가 생기고 (2) (3) 방법은 예시("1002405 건에서 10건만 랜덤하게 가져오기")와 같은 경우에서도 리턴갯수를 정확하게 맞춰서 가져올 수는 있으나 100만건 정도에서 값을 가져오게 되면 속도가 현저히 덜어집니다.

  "1002405 건에서 10건만 랜덤하게 가져오기"와 같이 100만건 이상의 테이블에서 일정갯수만 랜덤하게 그리고 빠르게 가져올 수 있는 방법이 없을까요??   

 

SELECT * FROM
(
    SELECT ROWNUM RN,A.* FROM TABLE_A A
)
WHERE RN IN (
    SELECT TRUNC((DBMS_RANDOM.VALUE)*1002405+1 ,0) RANDOM FROM DUAL
    CONNECT BY LEVEL < 10
)





'DATABASE' 카테고리의 다른 글

[MySQL] admin 잊어버렸을때..  (4) 2011.05.01
Posted by finewoo
,