카테고리:

쿼리 구문

SAMPLE / TABLESAMPLE

지정된 테이블에서 무작위로 샘플링된 행의 하위 세트를 반환합니다. 다음 샘플링 방법이 지원됩니다.

  • 주어진 행을 포함할 지정된 확률로 테이블의 일부를 샘플링합니다. 반환되는 행 수는 테이블의 크기와 요청된 확률에 따라 다릅니다. 샘플링을 결정적으로 만들기 위해 시드를 지정할 수 있습니다.

  • 고정된 지정된 수의 행을 샘플링합니다. 테이블에 더 적은 수의 행이 포함되어 있지 않은 한, 지정된 행의 정확한 수가 반환됩니다.

SAMPLE 및 TABLESAMPLE은 동의어이며 서로 바꿔서 사용할 수 있습니다.

구문

SELECT ...
FROM ...
  { SAMPLE | TABLESAMPLE } [ samplingMethod ] ( { <probability> | <num> ROWS } ) [ { REPEATABLE | SEED } ( <seed> ) ]
[ ... ]
Copy

여기서:

samplingMethod ::= { { BERNOULLI | ROW } |
                     { SYSTEM | BLOCK } }
Copy
BERNOULLI | ROW 또는 . SYSTEM | BLOCK

사용할 샘플링 방법을 지정합니다.

  • BERNOULLI (또는 ROW): p/100 probability 로 각 행을 포함합니다. 각 행에 대해 가중 동전을 던지는 것과 유사합니다.

  • SYSTEM (또는 BLOCK): p/100 probability 로 각 행 블록을 포함합니다. 각 행 블록에 대해 가중 동전을 던지는 것과 유사합니다. 이 방법은 고정 크기 샘플링을 지원하지 않습니다.

샘플링 방법은 선택 사항입니다. 방법이 지정되지 않은 경우 기본값은 BERNOULLI 입니다.

probability 또는 . num ROWS

테이블의 일부를 기반으로 샘플링할지, 아니면 테이블의 고정된 행 수를 기반으로 샘플링할지 여부를 지정합니다. 여기서:

  • probability 은 표본 선택에 사용할 백분율 확률을 지정합니다. 0 (선택된 행 없음)에서 100 (모든 행이 선택됨) 사이의 10진수일 수 있습니다.

  • num 는 테이블에서 샘플링할 행 수(최대 1,000,000)를 지정합니다. 0 (선택된 행 없음)에서 1000000 (해당 숫자 포함) 사이의 정수일 수 있습니다.

REPEATABLE | SEED ( seed )

샘플링을 결정적으로 만들기 위한 시드 값을 지정합니다. 0 에서 2147483647 (해당 숫자 포함) 사이의 정수일 수 있습니다.

사용법 노트

  • 다음 키워드는 서로 바꿔서 사용할 수 있습니다.

    • SAMPLE | TABLESAMPLE

    • BERNOULLI | ROW

    • SYSTEM | BLOCK

    • REPEATABLE | SEED

  • 반환되는 행 수는 지정된 샘플링 방법에 따라 다릅니다.

    일부 기반:
    • BERNOULLI | ROW 샘플링의 경우, 반환되는 행의 예상 수는 (p/100)*n 입니다.

    • SYSTEM | BLOCK 샘플링의 경우, 샘플이 편향될 수 있으며 특히 작은 테이블의 경우 더욱 그렇습니다.

    참고

    매우 큰 테이블의 경우, 두 방법의 차이는 무시할 수 있습니다.

    또한, 샘플링은 확률적 프로세스이기 때문에, 반환되는 행의 수는 행 (p/100)*n 개에 정확히 해당하지는 않지만 이에 가깝습니다.

    • seed 를 지정하지 않는 경우, SAMPLE은 동일한 쿼리가 반복될 때 다른 결과를 생성합니다.

    • 테이블이 변경되지 않고 동일 seedprobability 가 지정된 경우, SAMPLE은 동일한 결과를 생성합니다. 그러나 동일 probabilityseed 가 지정되더라도 테이블 복사본에 대한 샘플링은 원본 테이블에 대한 샘플링과 동일한 결과를 반환하지 않을 수 있습니다.

    고정 크기:
    • 테이블이 요청된 행 수보다 큰 경우, 요청된 행 수가 항상 반환됩니다.

    • 테이블이 요청된 행 수보다 작은 경우, 전체 테이블이 반환됩니다.

    • SYSTEM | BLOCKseed 는 고정 크기 샘플링에 지원되지 않습니다. 예를 들어, 다음 쿼리는 오류를 생성합니다.

      select * from example_table sample system (10 rows);
      
      select * from example_table sample row (10 rows) seed (99);
      
      Copy
  • seed 를 사용한 샘플링은 뷰 또는 하위 쿼리에서 지원되지 않습니다. 예를 들어 다음 쿼리는 오류를 생성합니다.

    select * from (select * from example_table) sample (1) seed (99);
    
    Copy
  • JOIN 의 결과를 샘플링하는 것은 허용되지만, 다음 사항이 모두 참인 경우에만 허용됩니다.

    • 샘플은 행 기반(Bernoulli)입니다.

    • 샘플링은 시드를 사용하지 않습니다.

    샘플링은 조인이 완전히 처리된 후에 수행됩니다. 따라서 샘플링은 결합된 행 수를 줄이지 않으며 JOIN 비용을 줄이지 않습니다. 섹션에는 JOIN 의 결과를 샘플링하는 예가 포함되어 있습니다.

  • probability | num ROWSseed 지정에 리터럴을 사용하는 것 외에도, 세션 또는 바인드 변수도 사용할 수 있습니다.

성능 고려 사항

  • SYSTEM | BLOCK 샘플링은 BERNOULLI | ROW 샘플링보다 빠른 경우가 많습니다.

  • seed 없이 샘플링하는 것이 seed 로 샘플링하는 것보다 빠른 경우가 많습니다.

  • 고정 크기 샘플링은 동등한 일부 기반 샘플링보다 느릴 수 있습니다. 고정 크기 샘플링은 일부 쿼리 최적화를 방해하기 때문입니다.

일부 기반 행 샘플링

각 행이 샘플에 포함될 확률이 10%인 테이블의 샘플을 다음과 같이 반환합니다.

SELECT * FROM testtable SAMPLE (10);
Copy

각 행이 샘플에 포함될 확률이 20.3%인 테이블의 샘플을 다음과 같이 반환합니다.

SELECT * FROM testtable TABLESAMPLE BERNOULLI (20.3);
Copy

테이블의 모든 행을 포함하여 전체 테이블을 다음과 같이 반환합니다.

SELECT * FROM testtable TABLESAMPLE (100);
Copy

빈 샘플을 다음과 같이 반환합니다.

SELECT * FROM testtable SAMPLE ROW (0);
Copy

이 예에서는 조인에서 여러 테이블을 샘플링하는 방법을 보여줍니다.

SELECT i, j
    FROM
         table1 AS t1 SAMPLE (25)     -- 25% of rows in table1
             INNER JOIN
         table2 AS t2 SAMPLE (50)     -- 50% of rows in table2
    WHERE t2.j = t1.i
    ;
Copy

SAMPLE 절은 이전의 모든 테이블이나 SAMPLE 절 이전의 전체 식이 아니라 하나의 테이블에만 적용됩니다. 다음 JOIN 작업은 t1의 모든 행을 table2에 있는 행의 50% 샘플에 조인합니다. 두 테이블의 모든 행을 조인한 결과로 발생하는 행의 50%는 샘플링하지 않습니다.

SELECT i, j
    FROM table1 AS t1 INNER JOIN table2 AS t2 SAMPLE (50)
    WHERE t2.j = t1.i
    ;
Copy

JOIN 의 개별 테이블이 아닌 JOIN 의 결과에 SAMPLE 절을 적용하려면 JOIN 의 결과가 포함된 인라인 뷰에 JOIN 을 적용하십시오. 예를 들어, 하위 쿼리로서 JOIN 을 수행한 후, 하위 쿼리의 결과에 SAMPLE을 적용하십시오. 아래 예는 JOIN 에서 반환된 행의 약 1%를 샘플링합니다.

select *
   from (
         select *
            from t1 join t2
               on t1.a = t2.c
        ) sample (1);
Copy

일부 기반 블록 샘플링(시드 사용)

각 행 블록이 샘플에 포함될 확률이 3%인 테이블의 샘플을 반환하고 시드를 82로 설정합니다.

SELECT * FROM testtable SAMPLE SYSTEM (3) SEED (82);
Copy

각 행 블록이 샘플에 포함될 확률이 0.012%인 테이블의 샘플을 반환하고 시드를 99992로 설정합니다.

SELECT * FROM testtable SAMPLE BLOCK (0.012) REPEATABLE (99992);
Copy

참고

이러한 쿼리 중 하나가 테이블 변경 없이 다시 실행되면 동일한 샘플 세트를 반환합니다.

고정 크기 행 샘플링

각 행이 샘플에 포함될 확률이 min(1, 10/n) 인 10개 행의 고정 크기 샘플을 반환합니다. 여기서 n 은 테이블의 행 수입니다.

SELECT * FROM testtable SAMPLE (10 ROWS);
Copy