- 카테고리:
SAMPLE / TABLESAMPLE¶
지정된 테이블에서 무작위로 샘플링된 행의 하위 세트를 반환합니다. 다음 샘플링 방법이 지원됩니다.
주어진 행을 포함할 지정된 확률로 테이블의 일부를 샘플링합니다. 반환되는 행 수는 테이블의 크기와 요청된 확률에 따라 다릅니다. 샘플링을 결정적으로 만들기 위해 시드를 지정할 수 있습니다.
고정된 지정된 수의 행을 샘플링합니다. 테이블에 더 적은 수의 행이 포함되어 있지 않은 한, 지정된 행의 정확한 수가 반환됩니다.
SAMPLE 및 TABLESAMPLE은 동의어이며 서로 바꿔서 사용할 수 있습니다.
구문¶
SELECT ...
FROM ...
{ SAMPLE | TABLESAMPLE } [ samplingMethod ] ( { <probability> | <num> ROWS } ) [ { REPEATABLE | SEED } ( <seed> ) ]
[ ... ]
여기서:
samplingMethod ::= { { BERNOULLI | ROW } | { SYSTEM | BLOCK } }
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은 동일한 쿼리가 반복될 때 다른 결과를 생성합니다.테이블이 변경되지 않고 동일
seed
및probability
가 지정된 경우, SAMPLE은 동일한 결과를 생성합니다. 그러나 동일probability
및seed
가 지정되더라도 테이블 복사본에 대한 샘플링은 원본 테이블에 대한 샘플링과 동일한 결과를 반환하지 않을 수 있습니다.
- 고정 크기:
테이블이 요청된 행 수보다 큰 경우, 요청된 행 수가 항상 반환됩니다.
테이블이 요청된 행 수보다 작은 경우, 전체 테이블이 반환됩니다.
SYSTEM | BLOCK
및seed
는 고정 크기 샘플링에 지원되지 않습니다. 예를 들어, 다음 쿼리는 오류를 생성합니다.select * from example_table sample system (10 rows); select * from example_table sample row (10 rows) seed (99);
seed
를 사용한 샘플링은 뷰 또는 하위 쿼리에서 지원되지 않습니다. 예를 들어 다음 쿼리는 오류를 생성합니다.select * from (select * from example_table) sample (1) seed (99);
JOIN
의 결과를 샘플링하는 것은 허용되지만, 다음 사항이 모두 참인 경우에만 허용됩니다.샘플은 행 기반(Bernoulli)입니다.
샘플링은 시드를 사용하지 않습니다.
샘플링은 조인이 완전히 처리된 후에 수행됩니다. 따라서 샘플링은 결합된 행 수를 줄이지 않으며
JOIN
비용을 줄이지 않습니다. 예 섹션에는JOIN
의 결과를 샘플링하는 예가 포함되어 있습니다.probability | num ROWS
및seed
지정에 리터럴을 사용하는 것 외에도, 세션 또는 바인드 변수도 사용할 수 있습니다.
성능 고려 사항¶
SYSTEM | BLOCK
샘플링은BERNOULLI | ROW
샘플링보다 빠른 경우가 많습니다.seed
없이 샘플링하는 것이seed
로 샘플링하는 것보다 빠른 경우가 많습니다.고정 크기 샘플링은 동등한 일부 기반 샘플링보다 느릴 수 있습니다. 고정 크기 샘플링은 일부 쿼리 최적화를 방해하기 때문입니다.
예¶
일부 기반 행 샘플링¶
각 행이 샘플에 포함될 확률이 10%인 테이블의 샘플을 다음과 같이 반환합니다.
SELECT * FROM testtable SAMPLE (10);
각 행이 샘플에 포함될 확률이 20.3%인 테이블의 샘플을 다음과 같이 반환합니다.
SELECT * FROM testtable TABLESAMPLE BERNOULLI (20.3);
테이블의 모든 행을 포함하여 전체 테이블을 다음과 같이 반환합니다.
SELECT * FROM testtable TABLESAMPLE (100);
빈 샘플을 다음과 같이 반환합니다.
SELECT * FROM testtable SAMPLE ROW (0);
이 예에서는 조인에서 여러 테이블을 샘플링하는 방법을 보여줍니다.
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 ;
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 ;
JOIN
의 개별 테이블이 아닌 JOIN
의 결과에 SAMPLE
절을 적용하려면 JOIN
의 결과가 포함된 인라인 뷰에 JOIN
을 적용하십시오. 예를 들어, 하위 쿼리로서 JOIN
을 수행한 후, 하위 쿼리의 결과에 SAMPLE을 적용하십시오. 아래 예는 JOIN
에서 반환된 행의 약 1%를 샘플링합니다.
select * from ( select * from t1 join t2 on t1.a = t2.c ) sample (1);
일부 기반 블록 샘플링(시드 사용)¶
각 행 블록이 샘플에 포함될 확률이 3%인 테이블의 샘플을 반환하고 시드를 82로 설정합니다.
SELECT * FROM testtable SAMPLE SYSTEM (3) SEED (82);
각 행 블록이 샘플에 포함될 확률이 0.012%인 테이블의 샘플을 반환하고 시드를 99992로 설정합니다.
SELECT * FROM testtable SAMPLE BLOCK (0.012) REPEATABLE (99992);
참고
이러한 쿼리 중 하나가 테이블 변경 없이 다시 실행되면 동일한 샘플 세트를 반환합니다.
고정 크기 행 샘플링¶
각 행이 샘플에 포함될 확률이 min(1, 10/n)
인 10개 행의 고정 크기 샘플을 반환합니다. 여기서 n
은 테이블의 행 수입니다.
SELECT * FROM testtable SAMPLE (10 ROWS);