카테고리:

쿼리 구문

SAMPLE / TABLESAMPLE

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

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

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

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

구문

SELECT ...
FROM ...
  { SAMPLE | TABLESAMPLE } [ samplingMethod ]
[ ... ]
Copy

여기서:

samplingMethod ::= { { BERNOULLI | ROW } ( { <probability> | <num> ROWS } ) |
                     { SYSTEM | BLOCK } ( <probability> ) [ { REPEATABLE | SEED } ( <seed> ) ] }
Copy

매개 변수

{ BERNOULLI | ROW } 또는 . { SYSTEM | BLOCK }

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

  • BERNOULLI (또는 ROW): p/100probability 로 각 행을 포함합니다. 이 방법은 각 행에 대해 무게가 있는 동전을 던지는 것과 비슷합니다.

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

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

probability 또는 . num ROWS

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

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

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

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

{ REPEATABLE | SEED ( seed ) }

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

리터럴을 사용하여 seed 를 지정하는 것 외에, 세션 또는 바인드 변수를 사용할 수도 있습니다.

사용법 노트

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

    • 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 (seed) 는 고정 크기 샘플링에 지원되지 않습니다. 예를 들어, 다음 쿼리는 오류를 생성합니다.

      SELECT * FROM example_table SAMPLE SYSTEM (10 ROWS);
      
      SELECT * FROM example_table SAMPLE ROW (10 ROWS) SEED (99);
      
      Copy
  • SEED (seed) 를 사용한 샘플링은 뷰 또는 하위 쿼리에서 지원되지 않습니다. 예를 들어 다음 쿼리는 오류를 생성합니다.

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

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

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

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

  • LIMIT 절과 SAMPLE 절은 모두 테이블에서 행 중 일부를 반환합니다. LIMIT 절을 사용할 경우 Snowflake는 가능한 가장 빠른 방법으로 지정된 수의 행을 반환합니다. SAMPLE 절을 사용할 경우 Snowflake는 해당 절에 지정된 샘플링 방법에 따라 행을 반환합니다.

성능 고려 사항

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

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

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

다음 예제에서는 SAMPLE 절을 사용합니다.

일부 기반 행 샘플링

각 행이 샘플에 포함될 확률이 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

이 예에서는 조인에서 여러 테이블을 샘플링하는 방법을 보여줍니다. table1 에 있는 행의 25%, table2 에 있는 행의 50%를 샘플링합니다.

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

SAMPLE 절은 이전의 모든 테이블이나 SAMPLE 절 이전의 전체 식이 아니라 하나의 테이블에만 적용됩니다. 다음 JOIN 연산은 table1 의 모든 행을 table2 에 있는 행의 50% 샘플에 조인합니다. 두 테이블의 모든 행을 조인하여 생성된 행의 50%를 샘플링하는 것이 아닙니다.

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

조인의 개별 테이블이 아닌 조인의 결과에 SAMPLE 절을 적용하려면 조인의 결과가 포함된 인라인 뷰에 조인을 적용하십시오. 예를 들어, 하위 쿼리로서 조인을 수행한 후, 하위 쿼리의 결과에 SAMPLE을 적용하십시오. 아래 예는 조인에서 반환된 행의 약 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