Q&A

  • 오라클에서 데이터 랜덤하게 쿼리하기
오라클에서 데이터를 랜덤하게 쿼리를 하는게 sample()을 이용하는걸로 알고 있습니다.

현재 데이터는 110건이 있구여

SELECT * FROM TBL_test SAMPLE(10)

이렇게 쿼리를 하면 11건의 데이터를 랜덤하게 가져오는거 아닌지여 ?

그런데 토드에서 쿼리를 계속 날려보면

8 - 15건 까지 다양하게 가져옴니다.

sample() 이안의 숫자가 레코드 갯수의 퍼센트를 의미하는게 아닌지여 ?
3  COMMENTS
  • Profile
    TeamB 2005.08.03 08:36

    sample(n) 은 총 row수에서 n%의 row를 가져옵니다.

    n개의 row를 고정적을 볼라면 where 절에서 rownum 으로 제한하면 어떨까요?

    select * from tbl_test sample(10) where rownum <= 10;

    흠...그리고 dbms_random 이라는 것도 있다고 하네요...이넘은 제가 안써본거라서...기본적으로 설치되는 패키지 인지도 모르겟습니다.

    그럼.


  • Profile
    cell 2005.08.03 08:51
    답변에 감사드립니다... 하지만 제가 원하는게 아니네요.
    레코드의 갯수가 고정적이지 않습니다.
    위의 내용은 예를 들어서 말씀드린거구여.
    250000 건중(정확치는 않음) 표본으로 5%의 데이타를 추출하려고 하는 겁니다. 좀 더 나오는건
    상관이 없을듯 싶은데 적게 나오면 문제가 될듯 싶어서요.


  • Profile
    서철기 2005.08.03 18:07
    처음 보는 함수라서 좀 찾아 봤는데요..
    결론은 대락적인 record를 return 한다네요..

    항상 같은 수의 레코드를 return하는게 하니라..
    sample(10)이면 10%내외의 대략 값의 row를 리턴한다는군요..

    더 나올수도 덜나올수도 있나는 거죠...

    아래 내용이  DB 참조할때 자주 가는 사이트에서 발췌한것인데요...
    참고하세요.

    ---------------------------------------------------------------------
    2. Oracle 8.1.x 이상(9i 포함)
    오라클은 데이터를 access 할때 Full Table Scan, Random Access 방식은 모든 버전에서 제공한
    방식이다. 8.1.x 이상 버전에는 이에 추가적으로 Sample Table Scan 방식을 제공한다. 이 Scan
    방식을 이용하면 Random 하게 데이터를 손쉽게 추출할수 있다.

    Sample Table Scan 방식을 간략하게 설명하고 이를 이용하여 어떻게 SQL에서 Random한 데이터를
    추출할수 있는지를 예제를 통하여 설명하겠다.

    2.1. Sample Table Scan
    Full Table Scan 방식은 모든 행을 Scan하기 위하여 테이블에 관련된 모든 블록을 차례로 읽고,
    각 레코드마다 where 조건을 만족하는지를 확인한다. Random Access 방식은 인덱스를 이용하여
    where 조건의 일부를 만족하는 레코드를 선택 테이블에 관련된 블록을 랜덤하게 읽고, 나머지
    where 조건을 만족하는 레코드를 출력한다. Sample Table Scan 방식은 Table의 데이터중
    임의로 주어진 비율 만큼의 데이터를 읽고 그중 where 조건을 만족하는 레코드를 리턴한다.

    2.2. Random Sample 추출 SQL
    SELECT .....
    FROM table_name SAMPLE {BLOCK option} (Sample Percent) <- 이 부분임
    WHERE ....
    GROUP BY ....
    HAVING ....
    ORDER BY

    - BLOCK option 사용시 블록 단위로 Sample 데이터를 주어진 비율(Sample Percent) 만큼 읽은후
    where 조건을 만족하는지 확인한다.
    - BLOCK option 생략시 레코드 단위로 Sample 데이터를 주어진 비율(Sample Percent) 만큼 읽은후
    where 조건을 만족하는지 확인한다.
    - 비율(Sample Percent)는 0.000001 와 99.999999값을 지원하며, 0 또는 100을 지원하지 않는다.
    (주의사항) 레코드 건수가 작은 테이블에서 sample이나 sample block 사용시에는 일정
    비율(Sample Percent)의 sample data가 return되지 않을 수있으며, 비율의 의미는
    대약적인 값이다. 즉 동일 SQL을 반복해서 수행해도 항상 같은 수의 레코드를
    리턴하는 것은 아니다.
    -------------------------------------------------------------------------------------------
    출처 : www.en-core.com 의 솔루션웨어하우스 내의 게시물중에서...
    -------------------------------------------------------------------------------------------