본문으로 바로가기
본문으로 바로가기

SAMPLE 절

SAMPLE 절은 SELECT 쿼리를 근사 방식으로 처리할 수 있게 합니다.

데이터 샘플링이 활성화되면 쿼리는 전체 데이터가 아니라 특정 비율의 데이터(샘플)에 대해서만 실행됩니다. 예를 들어, 모든 방문(visit)에 대한 통계를 계산해야 할 때, 전체 방문의 1/10에 해당하는 데이터에만 쿼리를 실행한 후 결과에 10을 곱하는 것으로 충분합니다.

근사 쿼리 처리는 다음과 같은 경우에 유용할 수 있습니다:

  • 엄격한 지연 시간 요구 사항(예: 100ms 미만)이 있지만, 이를 충족하기 위해 추가 하드웨어 리소스 비용을 정당화하기 어려운 경우
  • 원시 데이터 자체가 정확하지 않아, 근사 처리로 인해 품질이 눈에 띄게 저하되지 않는 경우
  • 비즈니스 요구 사항이 (비용 효율성 또는 정확한 결과를 프리미엄 사용자에게만 제공하기 위한) 근사 결과를 목표로 하는 경우

:::note
샘플링은 MergeTree 패밀리에 속한 테이블에서만 사용할 수 있으며, 테이블 생성 시 샘플링 표현식을 지정한 경우에만 사용할 수 있습니다(MergeTree 엔진 참고). :::

데이터 샘플링의 특징은 다음과 같습니다:

  • 데이터 샘플링은 결정적 메커니즘입니다. 동일한 SELECT .. SAMPLE 쿼리는 항상 동일한 결과를 반환합니다.
  • 샘플링은 서로 다른 테이블 간에도 일관되게 동작합니다. 단일 샘플링 키를 사용하는 테이블의 경우, 동일한 계수를 사용한 샘플은 항상 가능한 데이터의 동일한 부분집합을 선택합니다. 예를 들어, 사용자 ID의 샘플은 서로 다른 테이블에서 가능한 모든 사용자 ID 중 동일한 부분집합에 해당하는 행을 선택합니다. 이는 IN 절의 서브쿼리에서 샘플을 사용할 수 있음을 의미합니다. 또한 JOIN 절을 사용하여 샘플을 조인할 수도 있습니다.
  • 샘플링을 사용하면 디스크에서 더 적은 양의 데이터를 읽을 수 있습니다. 이때 샘플링 키를 올바르게 지정해야 합니다. 자세한 내용은 MergeTree 테이블 생성을 참조하십시오.

SAMPLE 절에 대해 다음 구문이 지원됩니다:

SAMPLE 절 구문설명
SAMPLE k여기서 k는 0에서 1 사이의 숫자입니다. 쿼리는 데이터의 k 비율에 대해 실행됩니다. 예를 들어, SAMPLE 0.1은 전체 데이터의 10%에 대해 쿼리를 실행합니다. 자세히 보기
SAMPLE n여기서 n은 충분히 큰 정수입니다. 쿼리는 최소 n 행(이 값보다 크게 벗어나지 않는 범위)의 샘플에 대해 실행됩니다. 예를 들어, SAMPLE 10000000은 최소 10,000,000 행에 대해 쿼리를 실행합니다. 자세히 보기
SAMPLE k OFFSET m여기서 km은 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 설정으로 지정됨)이므로, 그래뉼 크기보다 훨씬 큰 샘플을 설정하는 것이 합리적입니다.

SAMPLE n 절을 사용할 때는 전체 데이터에서 어느 정도의 상대적인 비율이 처리되었는지 알 수 없습니다. 따라서 집계 함수에 어떤 계수를 곱해야 하는지도 알 수 없습니다. 근사 결과를 얻기 위해 _sample_factor 가상 컬럼을 사용하십시오.

_sample_factor 컬럼에는 동적으로 계산되는 상대적인 계수 값이 저장됩니다. 이 컬럼은 지정된 샘플링 키로 테이블을 생성할 때 자동으로 생성됩니다. _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

여기서 km은 0에서 1 사이의 숫자입니다. 예시는 아래와 같습니다.

예시 1

SAMPLE 1/10

이 예에서는 전체 데이터의 1/10만 샘플링됩니다:

[++------------]

예제 2

SAMPLE 1/10 OFFSET 1/2

여기서는 데이터 후반부에서 10%를 샘플링합니다.

[------++------]