구체화된 뷰 관리

이 문서에서는 BigQuery에서 구체화된 뷰를 관리하는 방법을 설명합니다.

구체화된 뷰의 BigQuery 관리에는 다음 작업이 포함됩니다.

구체화된 뷰에 대한 자세한 내용은 다음을 참조하세요.

시작하기 전에

사용자에게 이 문서의 각 작업을 수행하는 데 필요한 권한을 부여하는 Identity and Access Management(IAM) 역할을 부여합니다. 태스크를 수행하는 데 필요한 권한(있는 경우)이 태스크의 '필요한 권한' 섹션에 나열됩니다.

구체화된 뷰 변경

Google Cloud 콘솔 또는 bq 명령줄 도구를 사용하거나 ALTER MATERIALIZED VIEWSET OPTIONS와 함께 데이터 정의 언어(DDL)를 사용해서 구체화된 뷰를 변경할 수 있습니다. 구체화된 뷰 옵션 목록은 materialized_view_set_options_list를 참조하세요.

다음은 enable_refreshtrue로 설정한 예시를 보여줍니다. 사용 사례에 맞게 조정하세요.

필수 권한

구체화된 뷰를 변경하려면 bigquery.tables.getbigquery.tables.update IAM 권한이 필요합니다.

다음과 같은 사전 정의된 각 IAM 역할에는 뷰를 삭제하는 데 필요한 권한이 포함되어 있습니다.

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

BigQuery Identity and Access Management(IAM)에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.

SQL

구체화된 뷰를 변경하려면 ALTER MATERIALIZED VIEW SET OPTIONS DDL 문을 사용합니다.

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    ALTER MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW
    SET OPTIONS (enable_refresh = true);
    

    다음을 바꿉니다.

    • PROJECT: 구체화된 뷰가 포함된 프로젝트의 이름
    • DATASET: 구체화된 뷰가 포함된 데이터 세트의 이름
    • MATERIALIZED_VIEW: 변경할 구체화된 뷰의 이름

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

bq

bq update 명령어를 실행합니다.

bq update \
--enable_refresh=true \
--refresh_interval_ms= \
PROJECT.DATASET.MATERIALIZED_VIEW

자바

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

BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.MaterializedViewDefinition;
import com.google.cloud.bigquery.Table;
import com.google.cloud.bigquery.TableId;

// Sample to update materialized view
public class UpdateMaterializedView {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String materializedViewName = "MY_MATERIALIZED_VIEW_NAME";
    updateMaterializedView(datasetName, materializedViewName);
  }

  public static void updateMaterializedView(String datasetName, String materializedViewName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, materializedViewName);

      // Get existing materialized view
      Table table = bigquery.getTable(tableId);
      MaterializedViewDefinition materializedViewDefinition = table.getDefinition();
      // Update materialized view
      materializedViewDefinition
          .toBuilder()
          .setEnableRefresh(true)
          .setRefreshIntervalMs(1000L)
          .build();
      table.toBuilder().setDefinition(materializedViewDefinition).build().update();
      System.out.println("Materialized view updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Materialized view was not updated. \n" + e.toString());
    }
  }
}

구체화된 뷰 나열

Google Cloud 콘솔, bq 명령줄 도구 또는 BigQuery API를 통해 구체화된 뷰를 나열할 수 있습니다.

필수 권한

데이터 세트의 구체화된 뷰를 나열하려면 bigquery.tables.list IAM 권한이 필요합니다.

사전 정의된 다음 각 IAM 역할에는 데이터 세트의 구체화된 뷰를 나열하는 데 필요한 권한이 포함되어 있습니다.

  • roles/bigquery.user
  • roles/bigquery.metadataViewer
  • roles/bigquery.dataViewer
  • roles/bigquery.dataOwner
  • roles/bigquery.dataEditor
  • roles/bigquery.admin

IAM 역할과 권한에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.

구체화된 뷰를 나열하는 프로세스는 테이블을 나열하는 프로세스와 동일합니다. 데이터 세트에서 구체화된 뷰를 나열하려면 다음 안내를 따르세요.

Console

  1. 탐색기 패널에서 프로젝트를 확장하고 데이터 세트를 선택합니다.

  2. 목록을 스크롤하여 데이터세트의 테이블을 확인합니다. 테이블, 뷰, 구체화된 뷰는 서로 다른 아이콘으로 구분됩니다.

    테이블 아이콘과 뷰 아이콘

bq

bq ls 명령어를 실행합니다. --format 플래그를 사용하면 출력을 제어할 수 있습니다. 기본 프로젝트가 아닌 프로젝트의 구체화된 뷰를 나열하려면 데이터 세트에 project_id:dataset 형식으로 프로젝트 ID를 추가합니다.

bq ls --format=pretty project_id:dataset

각 항목의 의미는 다음과 같습니다.

  • project_id는 프로젝트 ID입니다.
  • dataset는 데이터 세트 이름입니다.

명령어를 실행하면 Type 필드에 테이블 유형이 표시됩니다. 예를 들면 다음과 같습니다.

+-------------------------+--------------------+----------------------+-------------------+
|         tableId         | Type               |        Labels        | Time Partitioning |
+-------------------------+--------------------+----------------------+-------------------+
| mytable                 | TABLE              | department:shipping  |                   |
| mymatview               | MATERIALIZED_VIEW  |                      |                   |
+-------------------------+--------------------+----------------------+-------------------+

예:

기본 프로젝트의 mydataset 데이터 세트에 있는 구체화된 뷰를 나열하려면 다음 명령어를 입력합니다.

bq ls --format=pretty mydataset

myotherprojectmydataset 데이터 세트에 있는 구체화된 뷰를 나열하려면 다음 명령어를 입력합니다.

bq ls --format=pretty myotherproject:mydataset

API

API를 사용하여 구체화된 뷰를 나열하려면 tables.list 메서드를 호출합니다.

Go

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

BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
	"google.golang.org/api/iterator"
)

// listTables demonstrates iterating through the collection of tables in a given dataset.
func listTables(w io.Writer, projectID, datasetID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ts := client.Dataset(datasetID).Tables(ctx)
	for {
		t, err := ts.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return err
		}
		fmt.Fprintf(w, "Table: %q\n", t.TableID)
	}
	return nil
}

Python

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

BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set dataset_id to the ID of the dataset that contains
#                  the tables you are listing.
# dataset_id = 'your-project.your_dataset'

tables = client.list_tables(dataset_id)  # Make an API request.

print("Tables contained in '{}':".format(dataset_id))
for table in tables:
    print("{}.{}.{}".format(table.project, table.dataset_id, table.table_id))

구체화된 뷰에 대한 정보 가져오기

SQL, bq 명령줄 도구 또는 BigQuery API를 사용하여 구체화된 뷰에 대한 정보를 가져올 수 있습니다.

필수 권한

구체화된 뷰에 대한 정보를 쿼리하려면 다음 Identity and Access Management(IAM) 권한이 필요합니다.

  • bigquery.tables.get
  • bigquery.tables.list
  • bigquery.routines.get
  • bigquery.routines.list

다음과 같이 사전 정의된 각 IAM 역할에는 위의 권한이 포함되어 있습니다.

  • roles/bigquery.metadataViewer
  • roles/bigquery.dataViewer
  • roles/bigquery.admin

BigQuery 권한에 대한 자세한 내용은 IAM으로 액세스 제어를 참조하세요.

종속 구체화된 뷰 복제본을 포함한 구체화된 뷰에 대한 정보를 가져오려면 다음 안내를 따르세요.

SQL

구체화된 뷰에 대한 정보를 가져오려면 INFORMATION_SCHEMA.TABLES를 쿼리합니다.

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    SELECT * FROM PROJECT_ID.DATASET_ID.INFORMATION_SCHEMA.TABLES
    WHERE table_type = 'MATERIALIZED VIEW';
    

    다음을 바꿉니다.

    • PROJECT_ID: 구체화된 뷰가 포함된 프로젝트의 이름
    • DATASET_ID: 구체화된 뷰가 포함된 데이터 세트의 이름

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

bq

bq show 명령어를 사용합니다.

bq show --project=project_id --format=prettyjson dataset.materialized_view

다음을 바꿉니다.

  • project_id: 프로젝트 ID 기본 프로젝트가 아닌 다른 프로젝트에서 구체화된 뷰에 대한 정보를 가져오려면 이 플래그만 포함하면 됩니다.
  • dataset: 구체화된 뷰가 포함된 데이터 세트의 이름입니다.
  • materialized_view: 정보를 확인할 구체화된 뷰의 이름입니다.

예:

다음 명령어를 입력하여 myproject 프로젝트의 report_views 데이터 세트에 있는 구체화된 뷰 my_mv에 대한 정보를 표시합니다.

bq show --project=myproject --format=prettyjson report_views.my_mv

API

API를 사용하여 구체화된 뷰 정보를 가져오려면 tables.get 메서드를 호출합니다.

구체화된 뷰 삭제

Google Cloud 콘솔, bq 명령줄 도구, API를 통해 구체화된 뷰를 삭제할 수 있습니다.

구체화된 뷰를 삭제하면 이 구체화된 뷰와 연결된 권한도 삭제됩니다. 삭제된 구체화된 뷰를 다시 만들 때는 이전에 연결된 모든 액세스 권한을 수동으로 다시 구성해야 합니다.

필수 권한

구체화된 뷰를 삭제하려면 bigquery.tables.delete IAM 권한이 필요합니다.

다음과 같은 사전 정의된 각 IAM 역할에는 구체화된 뷰를 삭제하는 데 필요한 권한이 포함되어 있습니다.

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

BigQuery Identity and Access Management(IAM)에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.

SQL

구체화된 뷰를 삭제하려면 DROP MATERIALIZED VIEW DDL 문을 사용합니다.

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    DROP MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW;
    

    다음을 바꿉니다.

    • PROJECT: 구체화된 뷰가 포함된 프로젝트의 이름
    • DATASET: 구체화된 뷰가 포함된 데이터 세트의 이름
    • MATERIALIZED_VIEW: 삭제할 구체화된 뷰의 이름

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

bq

bq rm 명령어를 사용하여 구체화된 뷰를 삭제합니다.

API

tables.delete 메서드를 호출하고 projectId, datasetId, tableId 매개변수의 값을 지정합니다.

  • 프로젝트 ID에 projectId 매개변수를 할당합니다.
  • 데이터 세트 ID에 datasetId 매개변수를 할당합니다.
  • 삭제하려는 구체화된 뷰의 테이블 ID에 tableId 매개변수를 할당합니다.

자바

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

BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;

// Sample to delete materialized view
public class DeleteMaterializedView {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String materializedViewName = "MY_MATERIALIZED_VIEW_NAME";
    deleteMaterializedView(datasetName, materializedViewName);
  }

  public static void deleteMaterializedView(String datasetName, String materializedViewName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, materializedViewName);

      boolean success = bigquery.delete(tableId);
      if (success) {
        System.out.println("Materialized view deleted successfully");
      } else {
        System.out.println("Materialized view was not found");
      }
    } catch (BigQueryException e) {
      System.out.println("Materialized view was not found. \n" + e.toString());
    }
  }
}

구체화된 뷰 새로고침

구체화된 뷰를 새로고침하면 뷰의 캐시 처리된 결과가 기본 테이블의 현재 상태를 반영하도록 업데이트됩니다. 가능한 경우 BigQuery는 뷰를 새로고침한 마지막 시간 이후의 변경사항만 읽습니다. 최근에 스트리밍된 데이터는 구체화된 뷰를 새로고침하는 동안 포함되지 않을 수 있지만 쿼리는 구체화된 뷰의 사용 여부와 관계없이 항상 스트리밍된 데이터를 읽습니다. 이 섹션에서는 다음 작업을 수행하는 방법을 설명합니다.

자동 새로고침

기본적으로 구체화된 뷰는 기본 테이블이 변경되고 5분 이내에 자동으로 새로고침되지만 30분마다 새로고침됩니다. 변경 예시로는 행 삽입 또는 행 삭제 등이 있습니다.

최대 새로고침 실행 빈도를 사용하여 구체화된 뷰의 비용과 쿼리 성능을 관리할 수 있습니다. 최대 새로고침 실행 빈도에 관계없이 구체화된 뷰는 항상 최신 데이터를 반환합니다.

자동 새로고침은 언제든지 사용 설정하거나 사용 중지할 수 있습니다. 자동 새로고침 작업은 bigquery-adminbot@system.gserviceaccount.com 서비스 계정에서 수행되며 구체화된 뷰 프로젝트의 작업 기록에 표시됩니다.

자동 새로고침 사용 설정 및 사용 중지

테이블을 만들 때 자동 새로고침을 사용 중지하려면 enable_refreshfalse로 설정합니다.

CREATE MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW
PARTITION BY RANGE_BUCKET(column_name, buckets)
OPTIONS (enable_refresh = false)
AS SELECT ...

기존 구체화된 뷰의 경우 ALTER MATERIALIZED VIEW를 사용하여 enable_refresh 값을 수정할 수 있습니다.

ALTER MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW
SET OPTIONS (enable_refresh = true);

최대 실행 빈도 설정

자동 새로고침 실행 빈도에 대한 최대 실행 빈도를 구성할 수 있습니다. 기본적으로 구체화된 뷰는 30분마다 새로고침됩니다.

최대 새로고침 실행 빈도는 언제든지 변경할 수 있습니다.

구체화된 뷰를 만들 때 최대 새로고침 실행 빈도를 설정하려면 DDL에서 refresh_interval_minutes를 (또는 API와 bq 명령줄 도구로 refresh_interval_ms를) 원하는 값으로 설정하세요.

CREATE MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW
OPTIONS (enable_refresh = true, refresh_interval_minutes = 60)
AS SELECT ...

마찬가지로 테이블을 수정할 때 최대 실행 빈도를 설정할 수 있습니다. 이 예시에서는 이미 자동 새로고침을 사용하도록 설정했고 최대 실행 빈도 설정만 변경하려고 합니다.

ALTER MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW
SET OPTIONS (refresh_interval_minutes = 60);

최대 새로고침 실행 빈도의 최솟값은 1분입니다. 최대 새로고침 실행 빈도의 최댓값은 7일입니다.

언제든지 구체화된 뷰를 수동으로 새로고침할 수 있으며 타이밍에는 최대 실행 빈도 설정이 적용되지 않습니다.

최대한 노력

자동 새로고침은 최선을 다해 수행됩니다. BigQuery는 기본 테이블이 변경되고 5분 이내에 새로고침을 시작하려 시도하지만(이전 새로고침이 30분 이전에 수행된 경우), 새로고침이 그 시점에 시작된다는 보장도 없고 완료된다는 보장도 없습니다.

자동 새로고침은 일괄 우선순위를 갖는 쿼리와 유사하게 취급됩니다. 현재 구체화된 뷰의 프로젝트에 용량이 없으면 새로고침이 지연됩니다. 프로젝트에 새로고침 비용이 많이 발생하는 뷰가 여러 개 포함된 경우 각각의 개별 뷰가 기본 테이블에 비해 상당히 지연될 수 있습니다.

수동 새로고침

언제든지 구체화된 뷰를 새로고침할 수 있습니다.

필수 권한

구체화된 뷰를 수동으로 새로고침하려면 bigquery.tables.getData, bigquery.tables.update, bigquery.tables.updateData IAM 권한이 필요합니다.

다음과 같은 사전 정의된 각 IAM 역할에는 구체화된 뷰를 수동으로 새로고침하는 데 필요한 권한이 포함되어 있습니다.

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

BigQuery Identity and Access Management(IAM)에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.

구체화된 뷰의 데이터를 업데이트하려면 BQ.REFRESH_MATERIALIZED_VIEW 시스템 절차를 호출합니다. 이 절차를 호출하면 BigQuery가 기본 테이블에서 발생한 변경사항을 식별하고 변경사항을 구체화된 뷰에 적용합니다. 새로고침이 완료되면 BQ.REFRESH_MATERIALIZED_VIEW를 실행하는 쿼리가 완료됩니다.

CALL BQ.REFRESH_MATERIALIZED_VIEW('PROJECT.DATASET.MATERIALIZED_VIEW');

구체화된 뷰 모니터링

BigQuery API를 사용하여 구체화된 뷰 및 구체화된 뷰 새로고침 작업에 대한 정보를 가져올 수 있습니다. 자세한 내용은 구체화된 뷰 모니터링을 참조하세요.