전역 쿼리

전역 쿼리를 사용하면 둘 이상의 리전에 저장된 데이터를 참조하는 SQL 쿼리를 실행할 수 있습니다. 예를 들어 us-central1에 있는 테이블을 europe-central2에 있는 테이블과 조인하는 전역 쿼리를 실행할 수 있습니다. 이 문서에서는 프로젝트에서 전역 쿼리를 사용 설정하고 실행하는 방법을 설명합니다.

시작하기 전에

프로젝트에 전역 쿼리가 사용 설정되어 있는지 확인하고 전역 쿼리를 실행하는 데 필요한 권한이 있는지 확인합니다.

전역 쿼리 사용 설정

프로젝트 또는 조직의 전역 쿼리를 사용 설정하려면 ALTER PROJECT SET OPTIONS 또는 ALTER ORGANIZATION SET OPTIONS 을 사용하여 기본 구성을 변경합니다.

  • 리전에서 전역 쿼리를 실행하려면 쿼리를 실행하는 프로젝트의 해당 리전에서 enable_global_queries_execution 인수를 true로 설정합니다.
  • 전역 쿼리가 리전에서 데이터를 복사하도록 허용하려면 데이터가 포함된 프로젝트의 해당 리전에서 enable_global_queries_data_access 인수를 true로 설정합니다.
  • 쿼리가 원격 테이블에 액세스할 때마다 이러한 옵션이 확인됩니다.
  • 전역 쿼리는 한 프로젝트에서 실행되고 다른 프로젝트의 다른 리전에서 데이터를 가져올 수 있습니다.

예시: 교차 프로젝트 구성

다음 예시에서는 한 프로젝트에서 다른 프로젝트의 테이블에 액세스하는 쿼리를 실행하는 방법을 보여줍니다.

us-central1 리전에서 작업을 실행하는 query_project 프로젝트가 있고 europe-west1 리전에 있는 data_project.dataset.my_table 테이블에 액세스하는 쿼리를 실행하려는 경우:

SET @@location='us-central1';
SELECT
  *
FROM
  `query_project.dataset.my_table`
  JOIN `data_project.dataset.my_other_table` USING id;

이 전역 쿼리가 성공적으로 실행되도록 하려면 다음 구성이 필요합니다.

  1. 전역 쿼리를 실행하는 리전 (us-central1)의 프로젝트 (query_project)에서 전역 쿼리 실행을 사용 설정해야 합니다.

    ALTER PROJECT `query_project`
    SET OPTIONS (
    `region-us-central1.enable_global_queries_execution` = TRUE
    );
  2. 데이터가 포함된 프로젝트 (data_project)의 리전 (europe-west1)에서 전역 쿼리로 데이터를 복사하도록 사용 설정해야 합니다.

    ALTER PROJECT `data_project`
    SET OPTIONS (
    `region-europe-west1.enable_global_queries_data_access` = TRUE
    );

원격 테이블이 포함된 를 만들고 사용하는 경우 동일한 원칙이 적용됩니다. 쿼리를 실행하는 프로젝트에 enable_global_queries_execution이(가) 사용 설정되어 있어야 합니다.

이러한 ALTER PROJECT 작업은 서로 다른 프로젝트와 리전을 참조하므로 별도로 실행해야 합니다. 변경사항이 적용되는 데 몇 분 정도 걸릴 수 있습니다.

필요한 권한

전역 쿼리를 실행하려면 bigquery.jobs.createGlobalQuery 권한이 있어야 합니다. BigQuery 관리자 역할은 이 권한이 포함된 유일한 사전 정의된 역할입니다. BigQuery 관리자 역할을 부여하지 않고 전역 쿼리를 실행할 수 있는 권한을 부여하려면 다음 단계를 따르세요.

  1. 커스텀 역할을 만듭니다(예: 'BigQuery 전역 쿼리 실행자').
  2. 이 역할에 bigquery.jobs.createGlobalQuery를 추가합니다.
  3. 선택한 사용자 또는 서비스 계정에 이 역할을 할당합니다.

데이터 쿼리

전역 쿼리를 실행하려면 데이터가 단일 위치에 있는 경우와 마찬가지로 SQL 쿼리를 작성합니다. 쿼리에서 참조하는 데이터가 둘 이상의 위치에 저장된 경우 BigQuery는 전역 쿼리를 실행하려고 시도합니다. 경우에 따라 BigQuery는 쿼리의 위치를 자동으로 선택합니다. 그렇지 않으면 쿼리를 실행할 위치를 지정해야 합니다. 선택한 위치에 없는 쿼리에서 참조하는 데이터는 해당 위치로 복사됩니다.

다음 예시는 서로 다른 두 위치에 저장된 두 개의 서로 다른 데이터 세트의 테이블을 통합하는 전역 쿼리로 실행됩니다.

SELECT id, tr_date, product_id, price FROM us_dataset.transactions
UNION ALL
SELECT id, tr_date, product_id, price FROM europe_dataset.transactions

자동 위치 선택

다음과 같은 경우 쿼리를 실행해야 하는 위치가 자동으로 결정되며 변경할 수 없습니다.

위치 선택

일반적으로 전역 쿼리가 실행되는 위치를 결정합니다. 이 결정을 내리려면 다음을 고려하세요.

  • 전역 쿼리는 한 위치에서 다른 위치로 데이터를 일시적으로 복사합니다. 조직에 데이터 상주 요구사항이 있고 위치 A의 데이터가 위치 A를 벗어나지 않도록 하려면 쿼리 위치를 A로 설정합니다.

  • 위치 간에 전송되는 데이터의 양을 최소화하고 쿼리 비용을 줄이려면 쿼리된 데이터의 대부분이 저장된 리전에서 쿼리를 실행합니다.

온라인 상점이 있고 us-central1 위치에 제품 목록을 보관하지만 us-south1 리전에서 거래를 한다고 가정해 보겠습니다. 카탈로그에 있는 제품보다 거래가 더 많은 경우 us-south1 리전에서 쿼리를 실행해야 합니다.

전역 쿼리 이해

전역 쿼리를 효율적이고 비용 효율적인 방식으로 실행하려면 실행 메커니즘을 이해하는 것이 중요합니다.

서로 다른 위치에 있는 데이터를 사용하려면 한 위치로 복제해야 합니다. 다음은 BigQuery에서 수행하는 전역 쿼리 워크플로의 추상화입니다.

  1. 사용자 선언(user's declaration) 또는 자동(automatically)으로 쿼리를 실행해야 하는 위치를 결정합니다. 이 위치를 기본 위치라고 하며 쿼리에서 참조하는 다른 모든 위치는 원격 입니다.
  2. 각 원격 리전에서 하위 쿼리를 실행하여 기본 리전에서 쿼리를 완료하는 데 필요한 데이터를 수집합니다.
  3. 원격 위치에서 기본 위치로 이 데이터를 복사합니다.
  4. 기본 위치의 임시 테이블에 데이터를 8시간 동안 저장합니다.
  5. 기본 위치에서 수집된 모든 데이터로 최종 쿼리를 실행합니다.
  6. 쿼리 결과를 반환합니다.

BigQuery는 리전 간에 전송되는 데이터의 양을 최소화하려고 시도합니다. 다음 예시를 살펴보겠습니다.

SET @@location = 'EU';
SELECT
  t1.col1, t2.col2
FROM
  eu_dataset.table1 t1
  JOIN us_dataset.table2 t2 using col3
WHERE
  t2.col4 = 'ABC'

BigQuery는 미국에서 EU로 테이블 t2 전체를 복제할 필요가 없습니다. 요청된 열 (col2col3) 과 WHERE 조건 (t2.col4 = 'ABC')과 일치하는 행만 전송하면 됩니다. 그러나 푸시다운이라고 하는 이러한 메커니즘은 쿼리 구조에 따라 다르며 전송되는 데이터의 양이 클 수 있습니다. 데이터의 작은 하위 집합에서 전역 쿼리를 테스트하고 필요한 경우에만 데이터가 전송되는지 확인하는 것이 좋습니다.

관측 가능성

원격 리전으로 전송된 쿼리 텍스트를 보려면 작업 기록을 확인하세요. 원격 작업의 작업 ID는 추가 _xregion 접미사가 있는 원래 쿼리와 동일합니다.

전역 쿼리 사용 중지

프로젝트 또는 조직의 전역 쿼리를 사용 중지하려면 ALTER PROJECT SET OPTIONS statement 또는 ALTER ORGANIZATION SET OPTIONS statement 를 사용하여 기본 구성을 변경합니다.

  • 리전에서 전역 쿼리를 사용 중지하려면 해당 리전에서 enable_global_queries_execution 인수를 false 또는 NULL로 설정합니다.
  • 전역 쿼리가 리전에서 데이터를 복사하지 못하도록 하려면 해당 리전에서 enable_global_queries_data_access 인수를 false 또는 NULL로 설정합니다.

다음 예시에서는 프로젝트 수준에서 전역 쿼리를 사용 중지하는 방법을 보여줍니다.

ALTER PROJECT PROJECT_ID
SET OPTIONS (
  `region-REGION.enable_global_queries_execution` = false,
  `region-REGION.enable_global_queries_data_access` = false
);

다음을 바꿉니다.

  • PROJECT_ID: 변경할 프로젝트의 이름
  • REGION: 전역 쿼리를 사용 중지할 리전의 이름

변경사항이 적용되는 데 몇 분 정도 걸릴 수 있습니다.

가격 책정

전역 쿼리 비용은 다음 구성요소로 이루어집니다.

할당량

전역 쿼리와 관련된 할당량에 대한 자세한 내용은 쿼리 작업을 참조하세요.

제한사항

  • 쿼리의 실행 세부정보실행 그래프에는 원격 위치에서 처리되고 전송된 바이트 수가 표시되지 않습니다. 이 정보는 작업 기록에서 찾을 수 있는 복사 작업에 표시됩니다. 전역 쿼리로 생성된 복사 작업의 작업 ID에는 쿼리 작업의 작업 ID가 접두사로 있습니다.
  • 샌드박스 모드에서는 전역 쿼리가 지원되지 않습니다.
  • 전역 쿼리는 리전 간에 데이터를 전송하는 데 필요한 시간으로 인해 단일 리전 쿼리보다 지연 시간이 더 깁니다.
  • 전역 쿼리는 리전 간에 데이터 전송을 방지하기 위해 캐시를 사용하지 않습니다.
  • 전역 쿼리를 사용하여 _PARTITIONTIME과 같은 유사 열을 쿼리할 수 없습니다.
  • 전역 쿼리를 사용하여 RANGE 유형 열을 쿼리할 수 없습니다.
  • 전역 쿼리를 사용하여 유연한 열 이름으로 열을 쿼리할 수 없습니다.
  • 전역 쿼리에서 원격 리전의 INFORMATION_SCHEMA를 쿼리할 수 없습니다.
  • 전역 승인된 뷰승인된 루틴은 지원되지 않습니다 (한 위치의 뷰 또는 루틴이 다른 위치의 데이터 세트에 액세스하도록 승인된 경우).
  • 전역 쿼리에 대한 구체화된 뷰는 지원되지 않습니다.
  • 전역 쿼리가 STRUCT 열을 참조하는 경우 원격 하위 쿼리에는 푸시다운이 적용되지 않습니다. 성능을 최적화하려면 원격 리전에 STRUCT 열을 필터링하고 필요한 필드만 개별 열로 반환하는 뷰를 만드는 것이 좋습니다.
  • 전역 쿼리는 원자적으로 실행되지 않습니다. 데이터 복제가 성공했지만 전체 쿼리가 실패하는 경우 데이터 복제에 대한 요금이 청구됩니다.
  • 전역 쿼리 실행의 일부로 원격 리전에 생성된 임시 테이블 은 전역 쿼리 결과를 암호화하도록 구성된 CMEK 키 (테이블, 데이터 세트 또는 프로젝트 수준)가 전역인 경우에만 고객 관리 암호화 키(CMEK) 를 사용하여 암호화됩니다. 원격 임시 테이블이 항상 CMEK를 사용하여 보호되도록 하려면 원격 리전에서 전역 쿼리를 실행하는 프로젝트의 기본 KMS 키를 설정합니다.
  • 전역 쿼리는 Assured Workloads에서 지원되지 않습니다.
  • 단일 전역 쿼리는 리전당 최대 10개의 원격 테이블에 액세스할 수 있습니다.