클러스터링된 테이블 쿼리

클러스터링된 테이블 쿼리

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

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

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

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

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

  • Cloud Console 또는 기본 BigQuery 웹 UI 사용
  • 명령줄 도구의 bq query 명령어 사용
  • jobs.insert API 메서드 호출 및 쿼리 작업 구성
  • 클라이언트 라이브러리 사용

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

필수 권한

테이블을 쿼리하려면 최소한 bigquery.tables.getData 권한을 부여받아야 합니다.

다음과 같은 사전 정의된 Cloud IAM 역할에는 bigquery.tables.getData 권한이 포함되어 있습니다.

  • bigquery.dataViewer
  • bigquery.dataOwner
  • bigquery.dataEditor
  • bigquery.admin

또한 사용자에게 bigquery.datasets.create 권한이 있으면 해당 사용자가 데이터세트를 만들 때 이에 대한 bigquery.dataOwner 액세스 권한이 부여됩니다. bigquery.dataOwner 액세스 권한이 있으면 사용자가 데이터세트에서 테이블과 뷰를 쿼리할 수 있습니다.

쿼리 작업을 실행하려면 bigquery.jobs.create 권한도 부여받아야 합니다. 다음과 같은 사전 정의된 Cloud IAM 역할에는 bigquery.jobs.create 권한이 포함되어 있습니다.

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

BigQuery의 Cloud 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

다음 단계