클러스터링된 테이블 쿼리

클러스터링된 테이블 쿼리

BigQuery에서 클러스터링된 테이블을 만들 때, 테이블 데이터는 테이블 스키마에 있는 1개 이상의 열에 있는 콘텐츠를 기준으로 자동 정렬됩니다. 지정하는 열은 관련 데이터를 배치하는 데 사용됩니다. 여러 열을 사용해 테이블을 클러스터링할 때는 열 순서 지정이 중요합니다. 지정된 열의 순서에 따라 데이터의 정렬 순서가 결정됩니다.

클러스터링된 테이블에 쿼리를 실행할 때 성능을 최적화하려면 클러스터링된 열이 지정된 순서대로 1개 또는 여러 개의 클러스터링된 열을 필터링하는 표현식을 사용합니다. 일반적으로 클러스터링된 열을 필터링하는 쿼리가 클러스터링되지 않은 열만 필터링하는 쿼리보다 성능이 우수합니다.

BigQuery는 클러스터링 열의 값에 따라 클러스터링된 테이블의 데이터를 정렬하고 블록으로 정리합니다.

클러스터링된 열의 필터를 포함한 쿼리를 제출하는 경우 BigQuery는 클러스터링 정보를 사용해 블록에 쿼리와 관련된 데이터가 포함되어 있는지 효율적으로 판단합니다. BigQuery는 이러한 방식으로 관련 블록만 스캔하는데, 이 프로세스를 블록 프루닝이라고 합니다.

다음 방법으로 클러스터링된 테이블을 쿼리할 수 있습니다.

  • GCP Console 또는 기본 BigQuery 웹 UI 사용
  • 명령줄 도구의 bq query 명령어 사용
  • jobs.insert API 메소드 호출 및 쿼리 작업 구성

현재 클러스터링된 테이블에는 표준 SQL만 사용할 수 있습니다.

필수 권한

데이터세트 수준에서 클러스터링된 테이블을 쿼리하려면 테이블이 포함된 데이터세트에 대한 READER 액세스 권한이 필요합니다.

데이터세트 수준 권한을 사용하는 대신 bigquery.tables.getData 권한을 포함한 프로젝트 수준의 IAM 역할을 활용할 수 있습니다. bigquery.tables.getData 권한은 쿼리 중인 테이블의 데이터를 읽을 때 필요합니다. 사전 정의된 프로젝트 수준의 모든 IAM 역할에는 bigquery.user, bigquery.jobUser, bigquery.metadataViewer제외한 bigquery.tables.getData 권한이 포함됩니다.

쿼리 작업을 실행하려면 bigquery.jobs.create 권한도 부여받아야 합니다. 아래의 사전 정의된 프로젝트 수준 IAM 역할에는 bigquery.jobs.create 권한이 있습니다.

BigQuery에서 IAM 역할 및 권한에 대한 자세한 내용은 액세스 제어를 참조하세요. 데이터세트 수준 역할에 대한 자세한 내용은 데이터세트 기본 역할을 참조하세요.

권장사항

클러스터링된 테이블에 대한 쿼리 성능을 최대한 높이려면 다음과 같은 권장사항을 사용하세요.

예시에 사용된 샘플 테이블

이 페이지의 예시에서 사용된 샘플 테이블은 DDL 문을 사용해 만들어진 클러스터링된 테이블입니다. 이 DDL 문은 ClusteredSalesData라는 이름의 테이블을 만듭니다. 테이블은 customer_id - product_id - order_id 열 순으로 클러스터링됩니다.

CREATE TABLE
  `mydataset.ClusteredSalesData`
PARTITION BY
  DATE(timestamp)
CLUSTER BY
  customer_id,
  product_id,
  order_id AS
SELECT
  *
FROM
  `mydataset.SalesData`

지정된 순서대로 클러스터링된 열 필터링

필터를 지정할 때는 클러스터링된 열을 정렬 순서대로 필터링하는 표현식을 사용합니다.

다음 쿼리에는 customer_id를 필터링한 다음 product_id를 필터링하는 필터링 표현식이 있습니다. 이 쿼리는 클러스터링된 열을 정렬 순서대로 필터링하여 성능을 최적화합니다.

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  customer_id = 10000
  AND product_id LIKE 'gcp_analytics%'

다음 쿼리는 클러스터링된 열을 정렬 순서대로 필터링하지 않습니다. 그 결과 쿼리의 성능이 최적화되지 않습니다. 이 쿼리는 product_id를 필터링한 다음 order_id를 필터링합니다(customer_id는 건너뜁니다).

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  product_id LIKE 'gcp_analytics%'
  AND order_id = 20000

복잡한 필터링 표현식에 클러스터링된 열 사용 안 함

복잡한 필터링 표현식에서 클러스터링된 열을 사용하면 블록 프루닝을 적용할 수 없어 쿼리의 성능이 최적화되지 않습니다.

예를 들어, 다음 쿼리는 필터 표현식 함수에 클러스터링된 열(customer_id)이 사용되었으므로 블록이 프루닝되지 않습니다.

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  CAST(customer_id AS STRING) = "10000"

블록 프루닝을 통해 쿼리 성능을 최적화하려면 다음 예처럼 단순한 필터 표현식을 사용해야 합니다. 이 예에서는 단순한 필터링이 클러스터링된 열(customer_id)에 적용되었습니다.

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  customer_id = 10000

클러스터링된 열과 다른 열 비교 안 함

필더 표현식이 클러스터링된 열을 다른 열(클러스터링된 열 또는 클러스터링되지 않은 열)과 비교할 경우, 블록 프루닝을 적용할 수 없기 때문에 쿼리의 성능이 최적화되지 않습니다.

다음 쿼리는 필터 표현식에서 클러스터링된 열(customer_id)을 다른 열(order_id)과 비교하므로 블록이 프루닝되지 않습니다.

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  customer_id = order_id

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.