BigQuery 권장사항: 비용 관리

이 페이지에서는 BigQuery 비용 관리를 위한 권장사항을 설명합니다.

SELECT * 사용 금지

권장사항: 필요한 열만 쿼리하세요.

SELECT * 사용은 데이터를 쿼리하는 가장 비용이 많이 드는 방법입니다. SELECT *를 사용하면 BigQuery가 테이블의 모든 열을 전체 스캔합니다.

데이터를 실험하거나 탐색하는 경우에는 SELECT * 대신 데이터 미리보기 옵션 중 하나를 사용하세요.

SELECT * 쿼리에 LIMIT 절을 적용해도 쿼리가 읽는 데이터 양은 달라지지 않습니다. 전체 테이블에서 읽은 모든 바이트에 대해 요금이 청구되며 무료 등급 할당량에서 쿼리가 계산됩니다.

대신 필요한 열만 쿼리합니다. 예를 들어, SELECT * EXCEPT를 사용하면 결과에서 열을 한 개 이상 제외할 수 있습니다.

테이블의 모든 열을 쿼리하되 특정 데이터 하위 집합만 쿼리하고 싶다면 다음 방법을 고려해 보세요.

  • 대상 테이블에서 결과를 구체화하고 해당 테이블을 대신 쿼리합니다.
  • 날짜별로 테이블의 파티션을 나누고 관련 파티션을 쿼리합니다. 예를 들어 WHERE _PARTITIONDATE="2017-01-01"은 2017년 1월 1일 파티션만 스캔합니다.

미리보기 옵션을 사용하여 데이터 샘플링

권장사항: 쿼리를 실행하여 테이블 데이터를 탐색하거나 미리 보지 마세요.

데이터를 실험하거나 탐색하는 경우, 테이블 미리보기 옵션을 사용하여 할당량에 영향을 주지 않으면서 데이터를 무료로 볼 수 있습니다.

BigQuery는 다음과 같은 데이터 미리보기 옵션을 지원합니다.

  • 웹 UI의 테이블 세부정보 페이지에서 미리보기를 클릭하여 데이터를 샘플링합니다.
  • CLI에서 bq head 명령어를 사용하여 미리 볼 행 수를 지정합니다.
  • API에서 tabledata.list를 사용하여 지정된 행 조합에서 테이블 데이터를 가져옵니다.

쿼리를 실행하기 전에 가격 알아보기

권장사항: 쿼리를 실행하기 전에 먼저 미리보기를 통해 예상 비용을 알아보세요.

쿼리는 읽은 바이트 수에 따라 요금이 청구됩니다. 쿼리를 실행하기 전에 예상 비용을 알아보려면 다음을 사용하세요.

쿼리 검사기 사용

웹 UI에서 쿼리를 입력하면 쿼리 검사기가 쿼리 구문을 확인하고 읽을 바이트 수를 추정합니다. 이 추정값을 사용하여 가격 계산기로 쿼리 비용을 계산할 수 있습니다.

쿼리 검사기

테스트 실행 수행

명령줄

CLI에서 쿼리를 실행할 때는 --dry_run 플래그를 사용해 읽은 바이트 수를 추정할 수 있습니다. 이 추정값을 사용하여 가격 계산기로 쿼리 비용을 계산할 수 있습니다.

예를 들어, 다음 쿼리는 다음과 같은 응답을 생성합니다.

    bq --location=[LOCATION] query --use_legacy_sql=false --dry_run 'SELECT COUNTRY, AIRPORT, IATA FROM `[PROJECT].[DATASET].airports` LIMIT 1000'
    Query successfully validated. Assuming the tables are not modified, running this query will process 10918 bytes of data.

API를 사용하여 테스트 실행을 수행하려면 jobs.configuration.dryRuntrue로 설정해 쿼리 작업을 제출합니다.

API

API를 사용하여 테스트 실행을 수행하려면 jobs.configuration.dryRuntrue로 설정해 쿼리 작업을 제출합니다.

Go

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Go 설정 안내를 따르세요. 자세한 내용은 BigQuery Go API 참조 문서를 참조하세요.

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
q := client.Query(`
SELECT
	name,
	COUNT(*) as name_count
FROM ` + "`bigquery-public-data.usa_names.usa_1910_2013`" + `
WHERE state = 'WA'
GROUP BY name`)
q.DryRun = true
// Location must match that of the dataset(s) referenced in the query.
q.Location = "US"

job, err := q.Run(ctx)
if err != nil {
	return err
}
// Dry run is not asynchronous, so get the latest status and statistics.
status := job.LastStatus()
if err != nil {
	return err
}
fmt.Printf("This query will process %d bytes\n", status.Statistics.TotalBytesProcessed)

Python

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 참조하세요.

Python 클라이언트 라이브러리를 사용해 테스트 실행을 수행하려면 QueryJobConfig.dry_run 속성을 True로 설정합니다. 테스트 실행 쿼리 구성을 제공하면 Client.query()에서 항상 완료된 QueryJob을 반환합니다.
# from google.cloud import bigquery
# client = bigquery.Client()

job_config = bigquery.QueryJobConfig()
job_config.dry_run = True
job_config.use_query_cache = False
query_job = client.query(
    ('SELECT name, COUNT(*) as name_count '
     'FROM `bigquery-public-data.usa_names.usa_1910_2013` '
     "WHERE state = 'WA' "
     'GROUP BY name'),
    # Location must match that of the dataset(s) referenced in the query.
    location='US',
    job_config=job_config)  # API request

# A dry run query completes immediately.
assert query_job.state == 'DONE'
assert query_job.dry_run

print("This query will process {} bytes.".format(
    query_job.total_bytes_processed))

가격 계산기 사용

Google Cloud Platform 가격 계산기로 예상 쿼리 비용을 알아보려면 쿼리에서 처리되는 바이트 수를 MB, GB, TB 또는 PB 단위로 입력합니다. 쿼리가 1TB 미만을 처리하는 경우, BigQuery는 매달 1TB까지의 쿼리 처리를 무료 종량제로 지원하므로 예상 비용은 $0입니다.

가격 계산기

청구 바이트 수를 제한하여 쿼리 비용 제한

권장사항: 쿼리 비용을 제한하려면 청구 가능한 최대 바이트 설정을 사용합니다.

청구 가능한 최대 바이트 설정을 사용하여 쿼리에 대해 청구되는 바이트 수를 제한할 수 있습니다. 청구 가능한 최대 바이트를 설정하면 이 한도를 초과한 바이트 수를 읽는 쿼리는 실패하고 요금이 청구되지 않습니다.

청구 가능한 최대 바이트 설정으로 인해 쿼리가 실패하면 다음과 같은 오류가 반환됩니다.

Error: Query exceeded limit for bytes billed: 1000000. 10485760 or higher required.

청구 가능한 최대 바이트를 설정하려면 다음을 따르세요.

  • BigQuery 웹 UI에서 쿼리 옵션의 Maximum Bytes Billed(청구 가능한 최대 바이트) 필드에 정수를 입력합니다. 청구 가능한 최대 바이트
  • CLI에서 --maximum_bytes_billed 플래그와 함께 bq query 명령어를 사용합니다.

    bq --location=US query --maximum_bytes_billed=1000000 --use_legacy_sql=false "SELECT word FROM `bigquery-public-data.samples.shakespeare`"
    
  • API에서 maximumBytesBilled 속성을 설정합니다.

LIMIT는 비용에 영향을 미치지 않음

권장사항: 비용 관리 방법으로 LIMIT 절을 사용하지 마세요.

쿼리에 LIMIT 절을 적용해도 쿼리가 읽는 데이터의 양은 달라지지 않습니다. 결과 조합 출력만 제한될 뿐입니다. 쿼리에서 지정한 대로 전체 테이블에서 읽은 모든 바이트 요금이 청구됩니다.

쿼리가 읽는 데이터 양은 LIMIT 절이 있음에도 불구하고 무료 등급 할당량으로 계산됩니다.

대시보드에서 비용을 확인하고 감사 로그 쿼리

권장사항: BigQuery 사용량을 조정하기 위해 결제 데이터를 확인할 수 있는 대시보드를 만듭니다. 또한 감사 로그를 BigQuery로 스트리밍하여 사용 패턴을 분석할 수도 있습니다.

BigQuery로 결제 데이터를 내보내고 Google 데이터 스튜디오와 같은 도구로 시각화할 수 있습니다. 결제 대시보드를 만드는 방법은 BigQuery와 데이터 스튜디오를 사용하여 GCP 결제 시각화를 참조하세요.

또한 감사 로그를 BigQuery에 스트리밍하여 로그에서 사용자별 쿼리 비용과 같은 사용 패턴을 분석할 수 있습니다.

날짜별로 데이터 파티션 나누기

권장사항: 날짜별로 테이블 파티션을 나눕니다.

가능한 경우, 날짜별로 BigQuery 테이블 파티션을 나눕니다. 테이블 파티션을 나누면 관련 데이터 하위 집합을 쿼리할 수 있어 쿼리 성능이 향상되고 비용이 감소됩니다.

예를 들어, 파티션을 나눈 테이블을 쿼리하는 경우 _PARTITIONTIME 유사 열을 사용하여 날짜 또는 날짜 범위로 필터링합니다. 쿼리는 날짜 또는 날짜 범위가 지정된 파티션의 데이터만 처리합니다.

쿼리 결과를 단계별로 구체화하기

권장사항: 가능한 경우, 쿼리 결과를 단계별로 구체화합니다.

대량의 다단계 쿼리를 만들면 실행할 때마다 BigQuery가 쿼리에 필요한 모든 데이터를 읽습니다. 쿼리가 실행될 때마다 읽는 모든 데이터에 대한 요금이 청구됩니다.

하지만 쿼리를 단계별로 분할하면 각 단계에서 쿼리 결과를 대상 테이블에 기록하여 구체화할 수 있습니다. 작은 대상 테이블을 쿼리하므로 읽는 데이터의 양이 줄어들고 비용이 절감됩니다. 구체화된 결과를 저장하는 비용이 많은 양의 데이터를 처리하는 비용보다 훨씬 낮습니다.

큰 결과 집합 비용 고려하기

권장사항: 대량의 쿼리 결과를 대상 테이블에 쓰는 경우, 기본 테이블 만료 시간을 사용하여 더 이상 필요 없는 데이터를 삭제합니다.

BigQuery 저장소에 대량의 결과 집합을 보관하면 비용이 발생합니다. 결과에 영구적으로 액세스할 필요가 없으면 기본 테이블 만료를 사용하여 자동으로 데이터를 삭제하세요.

자세한 내용은 저장소 가격을 참조하세요.

스트리밍 삽입 사용 시 주의하기

권장사항: 데이터를 즉시 사용할 수 있어야 하는 경우에만 스트리밍 삽입을 사용합니다.

BigQuery에 데이터를 로드하는 데는 요금이 청구되지 않습니다. 그러나 BigQuery로 데이터를 스트리밍하면 요금이 청구됩니다. 데이터를 즉시 사용할 수 있어야 하는 경우가 아니라면 데이터를 스트리밍하지 말고 로드합니다.

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

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

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