SAMPLE 절
SAMPLE 절
SAMPLE 절은 SELECT 쿼리를 근사 처리(approximated processing)할 수 있게 해줘요. 데이터 샘플링이 활성화되면 쿼리는 전체 데이터가 아닌 일정 비율(샘플)의 데이터에 대해서만 수행돼요. 예를 들어 모든 방문에 대한 통계를 계산해야 한다면 전체 방문의 1/10에 대해서만 쿼리를 실행한 뒤 결과에 10을 곱하면 충분해요.
출처: 문서
본문
SAMPLE 절은 SELECT 쿼리를 근사 처리할 수 있게 해줘요. 데이터 샘플링이 활성화되면 쿼리는 전체 데이터가 아니라 특정 비율의 데이터(샘플)에 대해서만 수행돼요. 예를 들어 모든 방문 통계를 계산할 때는 전체 방문의 1/10에 대해 쿼리를 실행한 뒤 결과에 10을 곱하면 돼요. 근사 쿼리 처리는 다음과 같은 경우에 유용해요.
- 100ms 미만 같은 엄격한 지연 시간 요구사항이 있지만, 이를 충족하기 위해 추가 하드웨어 비용을 정당화할 수 없을 때.
- 원시 데이터가 정확하지 않아서 근사 처리가 품질을 눈에 띄게 떨어뜨리지 않을 때.
- 비즈니스 요구사항이 근사 결과를 목표로 할 때(비용 효율성을 위해, 또는 정확한 결과를 프리미엄 사용자에게 마케팅하기 위해).
샘플링은 MergeTree 계열 테이블에서만, 그리고 테이블 생성 시 샘플링 표현식이 지정된 경우에만 사용할 수 있어요 (MergeTree engine 참고). 데이터 샘플링의 특징은 다음과 같아요.
- 데이터 샘플링은 결정적(deterministic) 메커니즘이에요. 같은
SELECT .. SAMPLE쿼리의 결과는 항상 동일해요. - 샘플링은 서로 다른 테이블에서도 일관되게 동작해요. 단일 샘플링 키를 가진 테이블에서 같은 계수의 샘플은 항상 같은 부분집합을 선택해요. 예를 들어 사용자 ID 샘플은 서로 다른 테이블에서 가능한 모든 사용자 ID 중 같은 부분집합의 행을 가져와요. 즉 IN 절의 서브쿼리에서 샘플을 사용할 수 있어요. 또한 JOIN 절로 샘플을 조인할 수도 있어요.
- 샘플링을 사용하면 디스크에서 읽는 데이터를 줄일 수 있어요. 샘플링 키를 올바르게 지정해야 한다는 점에 유의해요. 자세한 내용은 Creating a MergeTree Table을 참고해요.
SAMPLE 절에는 다음 구문이 지원돼요.
| SAMPLE Clause Syntax | Description (설명) |
|---|---|
| SAMPLE k | 여기서 k는 0부터 1까지의 숫자예요. 쿼리는 데이터의 k 비율에 대해 실행돼요. 예를 들어 SAMPLE 0.1은 데이터의 10%에 대해 쿼리를 실행해요. 자세히 보기 |
| SAMPLE n | 여기서 n은 충분히 큰 정수예요. 쿼리는 최소 n개 행(그러나 이보다 훨씬 많지는 않은)의 샘플에 대해 실행돼요. 예를 들어 SAMPLE 10000000은 최소 10,000,000개 행에 대해 쿼리를 실행해요. 자세히 보기 |
| SAMPLE k OFFSET m | 여기서 k와 m은 0부터 1까지의 숫자예요. 쿼리는 데이터의 k 비율 샘플에 대해 실행돼요. 샘플에 사용되는 데이터는 m 비율만큼 오프셋돼요. 자세히 보기 |
SAMPLE K
여기서 k는 0부터 1까지의 숫자예요(분수 표기와 소수 표기 모두 지원). 예를 들어 SAMPLE 1/2 또는 SAMPLE 0.5예요. SAMPLE k 절에서 샘플은 데이터의 k 비율에서 가져와요. 예시는 다음과 같아요.
SELECT
Title,
count() * 10 AS PageViews
FROM hits_distributed
SAMPLE 0.1
WHERE
CounterID = 34
GROUP BY Title
ORDER BY PageViews DESC LIMIT 1000
이 예제에서 쿼리는 데이터의 0.1(10%) 비율 샘플에 대해 실행돼요. 집계 함수 값은 자동으로 보정되지 않으므로, 근사 결과를 얻으려면 count() 값을 수동으로 10을 곱해줘야 해요.
SAMPLE N
여기서 n은 충분히 큰 정수예요. 예를 들어 SAMPLE 10000000이에요. 이 경우 쿼리는 최소 n개 행(그러나 이보다 훨씬 많지는 않은)의 샘플에 대해 실행돼요. 예를 들어 SAMPLE 10000000은 최소 10,000,000개 행에 대해 쿼리를 실행해요. 데이터 읽기의 최소 단위는 하나의 granule(index_granularity 설정으로 크기가 정해짐)이므로, granule 크기보다 훨씬 큰 샘플을 설정하는 것이 합리적이에요. SAMPLE n 절을 사용할 때는 처리된 데이터의 상대 비율을 알 수 없어요. 따라서 집계 함수에 곱해야 할 계수도 알 수 없어요. 근사 결과를 얻으려면 _sample_factor 가상 열을 사용해요. _sample_factor 열에는 동적으로 계산되는 상대 계수가 들어 있어요. 이 열은 샘플링 키가 지정된 테이블을 create할 때 자동으로 생성돼요. _sample_factor 열의 사용 예시는 아래와 같아요. 사이트 방문 통계가 담긴 visits 테이블을 생각해 볼게요. 첫 번째 예시는 페이지 조회 수를 계산하는 방법이에요.
SELECT sum(PageViews * _sample_factor)
FROM visits
SAMPLE 10000000
다음 예시는 총 방문 수를 계산하는 방법이에요.
SELECT sum(_sample_factor)
FROM visits
SAMPLE 10000000
아래 예시는 평균 세션 지속 시간을 계산하는 방법이에요. 평균값을 계산할 때는 상대 계수를 사용할 필요가 없다는 점에 유의해요.
SELECT avg(Duration)
FROM visits
SAMPLE 10000000
SAMPLE K OFFSET M
여기서 k와 m은 0부터 1까지의 숫자예요. 예시는 아래와 같아요.
Example 1 (예제 1)
SAMPLE 1/10
이 예제에서 샘플은 전체 데이터의 1/10이에요.
[++------------]
Example 2 (예제 2)
SAMPLE 1/10 OFFSET 1/2
여기서 데이터의 두 번째 절반에서 10% 샘플을 가져와요.
[------++------]