데이터 엔지니어링

GCP BigQueryClustering 살펴보기

GCP BigQuery Clustering 살펴보기

들어가며

데이터의 양이 기하급수적으로 증가함에 따라, 데이터 분석의 성능을 극대화하는 것은 모든 기업에게 중요한 과제가 되었습니다. 앞선 글에서는 BigQuery에서 파티셔닝(Partitioning)을 통해 쿼리 성능과 비용을 최적화하는 방법을 소개했습니다. 그러나 파티셔닝만으로는 충분하지 않은 경우도 많습니다. 특히, 복잡한 쿼리에서 여러 열을 기준으로 필터링해야 하거나, 데이터의 물리적 정렬을 통해 더욱 빠른 분석이 필요한 경우가 있습니다.

이때 활용할 수 있는 방법이 바로 클러스터링(Clustering)입니다. 클러스터링은 특정 열을 기준으로 데이터를 물리적으로 정렬하여 쿼리 성능을 크게 향상시키는 방법입니다. 이번 글에서는 클러스터링의 개념과 이를 효과적으로 활용하는 방법에 대해 자세히 살펴보겠습니다.

클러스터링(Clustering)이란?

BigQuery Clustering의 기본 개념

클러스터링은 데이터를 특정 열 또는 열의 집합을 기준으로 물리적으로 정렬하여 쿼리 성능을 최적화하는 방법입니다. 클러스터링된 테이블은 쿼리 실행 시, 필터 조건과 일치하는 데이터만 빠르게 검색할 수 있도록 물리적으로 정렬된 데이터를 스캔합니다. 이로 인해, 전체 테이블을 스캔하는 시간이 줄어들고 비용이 절감됩니다.

예를 들어, 고객 주문 데이터에서 주문 날짜와 고객 ID를 기준으로 클러스터링하면, 고객별로 주문 데이터를 조회하거나 특정 날짜의 데이터를 빠르게 찾을 수 있습니다. 클러스터링은 데이터를 정렬된 상태로 유지하여 쿼리의 I/O 작업을 최소화하고, 특히 대규모 데이터셋에서 뛰어난 성능을 발휘합니다.

클러스터링은 파티셔닝과 달리 여러 열을 기준으로 정렬할 수 있기 때문에, 복잡한 쿼리에서 더욱 유용합니다. 하지만 클러스터링이 항상 필요한 것은 아니며, 사용하려는 데이터셋과 쿼리 패턴을 잘 이해한 후 적용하는 것이 중요합니다.

클러스터링된 테이블과 표준 테이블 비교

클러스터링이 적용된 테이블과 적용되지 않은 표준 테이블은 쿼리 성능에서 큰 차이를 보입니다. 이를 이해하기 위해 두 테이블을 비교해 보겠습니다.

표준 테이블

예를 들어, 아래와 같은 쿼리를 살펴봅시다.

CREATE OR REPLACE TABLE `TEST_DATASET_US.test_table_standard` AS (
  SELECT
    *
  FROM
    `bigquery-public-data.google_trends.top_terms`
  WHERE
    week BETWEEN "2015-09-15" AND "2024-09-15"
);

위 쿼리는 구글이 제공하는 빅쿼리 퍼블릭 데이터에 있는 구글 트렌드 데이터세트에서 top_terms 테이블을 가져와 클러스터링 되지 않은 표준 테이블로 저장하는 쿼리입니다.

해당 테이블에서 week = “2024-06-30”, term = “F1” 인 행을 조회한다고 생각해 봅시다.

SELECT
  *
FROM
  `TEST_DATASET_US.test_table_not_partitioned`
WHERE
  week = "2024-06-23"
  AND term = "F1"

테이블 스토리지 전체 용량과 쿼리에 의해 처리된 바이트를 비교하면, 해당 쿼리가 전체 테이블을 스캔했다는 것을 알 수 있습니다.

이처럼 클러스터링이 되지 않은 표준 테이블에서의 쿼리의 경우, 전체 테이블을 모두 스캔한 후, 필요한 행만을 반환하는 것을 알 수 있습니다.

클러스터링된 테이블(Clustered Table)

이번에는 week, term, dma_id 열을 기준으로 클러스터링된 테이블을 만들어 봅시다.

CREATE OR REPLACE TABLE `TEST_DATASET_US.test_table_clustered`
CLUSTER BY 
  week,
  term,
  dma_id
AS (
  SELECT
    *
  FROM
    `bigquery-public-data.google_trends.top_terms`
  WHERE
    week BETWEEN "2015-09-15" AND "2024-09-15"
);

week 열의 경우 DATE 타입이며, term 열의 경우 STRING, dma_id 열의 경우 INTEGER 타입이기 때문에 바로 클러스터링 기준에 포함할 수 있습니다.

만들어진 테이블의 경우, 기존 표준 테이블과 비교했을 때 테이블이 차지하는 스토리지 용량은 다르지 않습니다. 하지만 week, term, dam_id 열을 기준으로 클러스터링 되어있기 때문에, 클러스터링된 열을 기반으로 필터 조건을 사용할 때 BigQuery는 데이터를 정렬된 순서대로 빠르게 찾을 수 있어 전체 테이블을 스캔하지 않아도 됩니다.

테이블을 스캔하기 이전에 예측되는 쿼리 처리 바이트량은 동일하지만, 실제 쿼리 시에는 더 적은 처리 바이트를 사용하게 됩니다.

결과적으로, 클러스터링된 테이블은 특정 열에 대한 필터링이 자주 발생하는 경우, 특히 데이터셋이 클 때 더욱 유리합니다. 이를 통해 쿼리 성능이 크게 향상되며, 불필요한 I/O 작업이 줄어들어 비용 절감 효과도 기대할 수 있습니다.

Clustered Table이 필요한 경우

클러스터링은 모든 데이터셋에서 반드시 필요한 것은 아니지만, 특정 상황에서는 매우 유용한 성능 최적화 도구가 될 수 있습니다. 다음과 같은 경우에 클러스터링을 고려하는 것이 좋습니다.

  1. 자주 필터링되는 여러 열이 있는 경우
    • 클러스터링은 한 번에 여러 열을 기준으로 데이터를 물리적으로 정렬할 수 있습니다. 특정 열이나 열의 조합을 기준으로 데이터를 자주 필터링하는 경우, 클러스터링된 테이블을 사용하면 데이터 조회 속도를 크게 향상시킬 수 있습니다. 예를 들어, 고객 ID와 주문 날짜를 기준으로 데이터를 자주 조회하는 경우, customer_idorder_date 열을 기준으로 클러스터링하면 훨씬 더 효율적인 쿼리가 가능합니다.
  1. 범위 검색이 자주 이루어지는 경우
    • 클러스터링은 정렬된 데이터에 대해 범위 검색을 수행할 때 큰 이점을 제공합니다. 예를 들어, 주기적으로 특정 날짜 범위의 데이터를 조회하거나, ID 범위를 기준으로 데이터를 분석할 때 클러스터링된 테이블은 필요하지 않은 데이터의 스캔을 줄여 성능을 극대화할 수 있습니다. 특히 시간 기반 데이터, 트랜잭션 기록, 로그 데이터에서 유용하게 적용됩니다.
  1. 데이터의 크기가 매우 큰 경우
    • 대규모 데이터셋에서 전체 데이터를 스캔하는 것은 많은 비용과 시간이 소요됩니다. 클러스터링은 데이터가 물리적으로 정렬되어 있기 때문에 필요한 데이터만 빠르게 찾을 수 있어, 대용량 데이터셋에서 성능을 극대화할 수 있습니다. 이러한 이유로, 대규모 로그 데이터나 웹 트래픽 분석 데이터와 같은 대용량 데이터셋에서 클러스터링이 유용합니다.
  1. 다양한 필터 조건으로 데이터 분석이 필요한 경우
    • 하나의 테이블에서 여러 열을 조합한 다양한 필터 조건을 자주 사용하는 경우, 클러스터링이 적합합니다. 클러스터링은 파티셔닝과 달리 여러 열에 대해 쿼리를 최적화할 수 있으므로, 다양한 필터 조건을 사용하는 복잡한 쿼리에서 성능을 향상시킬 수 있습니다. 예를 들어, 고객 ID, 주문 날짜, 주문 상태와 같은 여러 기준을 동시에 필터링해야 하는 상황에서 클러스터링은 매우 효율적입니다.
  1. 특정 데이터 필터링 또는 집계가 자주 이루어지는 경우
    • 클러스터링은 데이터를 효율적으로 정렬해두기 때문에, 특정 열에 대한 필터링과 집계 쿼리가 자주 발생하는 상황에서 유리합니다. 예를 들어, 특정 지역의 매출 데이터를 자주 분석하는 경우, 지역별로 클러스터링된 테이블을 사용하면 분석 속도가 크게 개선됩니다.

Clustered Table이 필요하지 않은 경우

모든 경우에 클러스터링이 최적의 선택은 아닙니다. 데이터셋의 규모나 쿼리 패턴에 따라 클러스터링의 이점이 크지 않은 경우도 있습니다.

  1. 작은 데이터셋
    • 데이터셋이 작은 경우에는 클러스터링의 성능 개선 효과가 미미할 수 있습니다. 작은 테이블에서 쿼리를 실행하는 경우, 전체 테이블을 스캔해도 비용이나 시간이 크게 증가하지 않으므로 클러스터링이 큰 차이를 만들지 못할 수 있습니다.
  2. 전체 데이터를 자주 조회하는 경우
    • 클러스터링은 특정 열을 기준으로 데이터를 정렬하여 일부 데이터만 조회할 때 이점을 제공합니다. 하지만 전체 데이터를 자주 조회하는 경우에는 클러스터링의 효과가 제한적입니다. 이 경우에는 데이터 전체를 스캔해야 하므로, 클러스터링으로 인한 성능 향상은 크지 않을 수 있습니다.
  3. 클러스터링 기준이 자주 바뀌는 경우
    • 클러스터링된 열이 자주 바뀌는 경우, 클러스터링의 유지 관리가 복잡해질 수 있습니다. 클러스터링은 데이터를 물리적으로 정렬하기 때문에, 열이 자주 변경되면 다시 정렬하는 데 시간이 걸리며, 성능이 오히려 저하될 수 있습니다.

이처럼, 클러스터링은 특정 조건에서 매우 유용한 성능 최적화 도구이지만, 모든 상황에서 반드시 필요한 것은 아닙니다. 데이터의 특성과 쿼리 패턴을 충분히 고려하여 클러스터링을 적절히 사용하는 것이 중요합니다.

Clustered Table과 Partitioned Table을 결합하기

클러스터링과 파티셔닝은 각각의 기능만으로도 BigQuery에서 쿼리 성능을 최적화할 수 있지만, 두 가지를 함께 사용하면 더욱 강력한 성능 개선을 이끌어낼 수 있습니다. 파티셔닝은 데이터를 큰 범위로 나누어 불필요한 데이터 스캔을 줄여주고, 클러스터링은 파티션 내에서 데이터를 정렬해 세부적인 검색 성능을 최적화합니다.

두 기법을 결합하면 다음과 같은 장점이 있습니다.

  • 쿼리 성능 개선: 데이터의 큰 범위는 파티셔닝으로 관리하고, 필요한 세부 데이터는 클러스터링으로 빠르게 검색하여 성능을 극대화할 수 있습니다.
  • 비용 절감: 쿼리 시 스캔해야 하는 데이터 양을 최소화하여 쿼리 비용을 효율적으로 관리할 수 있습니다.
  • 효율적인 데이터 관리: 시간이 중요한 데이터나 여러 필터 조건이 자주 사용되는 대규모 데이터셋에서, 데이터를 더 체계적이고 효율적으로 관리할 수 있습니다.
CREATE OR REPLACE TABLE `TEST_DATASET_US.test_table_partitioned_clustered`
PARTITION BY
  week
CLUSTER BY 
  term,
  dma_id
AS (
  SELECT
    *
  FROM
    `bigquery-public-data.google_trends.top_terms`
  WHERE
    week BETWEEN "2015-09-15" AND "2024-09-15"
);

이 테이블은 week 열로 파티셔닝되어 있어 시간 기반의 쿼리 시 특정 기간의 데이터만 빠르게 조회할 수 있습니다. 예를 들어, 특정 주 또는 월별 데이터를 조회할 때 해당 기간의 파티션만 스캔하게 되어 성능이 향상됩니다.

또한, term과 dma_id 열로 클러스터링하여, 파티션 내에서 이 두 열을 기준으로 데이터를 물리적으로 정렬합니다. 이를 통해 term과 dma_id에 대한 필터링이 자주 이루어질 경우, 검색 성능을 크게 개선할 수 있습니다. 즉, 파티셔닝으로 대규모 데이터를 효율적으로 관리하고, 클러스터링으로 특정 필터 조건을 더욱 빠르게 처리할 수 있는 구조입니다.

결론

클러스터링과 파티셔닝을 함께 적용한 테이블은 쿼리 성능과 비용 절감 측면에서 매우 강력한 조합입니다. 파티셔닝을 통해 대규모 데이터를 시간 또는 범주별로 효율적으로 관리하고, 클러스터링을 통해 필터링이 자주 이루어지는 열에 대해 최적화된 성능을 제공합니다.

이를 통해 쿼리 시 스캔해야 할 데이터의 양을 줄이고, 처리 속도를 높여 보다 효율적인 데이터 분석이 가능해집니다. 특히, 시간에 따라 쌓이는 대규모 데이터셋과 복잡한 필터 조건을 자주 사용하는 상황에서, 이 두 기술을 결합하면 성능 향상과 비용 절감을 동시에 달성할 수 있습니다.

따라서, BigQuery에서 대규모 데이터를 다루는 경우 클러스터링과 파티셔닝을 적절히 결합하여 사용하면, 빠르고 효율적인 데이터 분석을 수행할 수 있습니다.

Share this post

About the author

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다