Spanner 통합 쿼리

데이터 분석가는 통합 쿼리를 사용하여 BigQuery에서 Spanner의 데이터를 쿼리할 수 있습니다.

BigQuery Spanner 통합을 사용하여 BigQuery는 데이터를 복사하거나 이동하지 않고도 Spanner에 있는 데이터를 실시간으로 쿼리할 수 있습니다.

다음 두 가지 방법으로 Spanner 데이터를 쿼리할 수 있습니다.

  • Spanner 외부 데이터 세트를 만듭니다.
  • EXTERNAL_QUERY 함수를 사용합니다.

외부 데이터 세트 사용

Spanner 테이블을 쿼리하는 가장 간단한 방법은 외부 데이터 세트를 만드는 것입니다. 외부 데이터 세트를 만들면 해당 Spanner 데이터베이스의 테이블이 BigQuery에 표시되며 쿼리(예: 조인, 합집합, 하위 쿼리)에서 이를 사용할 수 있습니다. 하지만 Spanner에서 BigQuery 저장소로 데이터가 이동하지는 않습니다.

외부 데이터 세트를 만드는 경우 Spanner 데이터를 쿼리하기 위해 연결을 만들 필요가 없습니다.

EXTERNAL_QUERY 함수 사용

다른 제휴 데이터베이스와 마찬가지로 EXTERNAL_QUERY 함수를 사용하여 Spanner 데이터를 쿼리할 수도 있습니다. 이는 PostgreSQL 언어를 사용하는 Spanner 데이터베이스를 쿼리하거나 연결 매개변수를 더 세부적으로 제어하려는 경우에 유용할 수 있습니다.

시작하기 전에

  • BigQuery 관리자가 Spanner 연결을 만들어 사용자와 공유했는지 확인합니다. 올바른 연결 선택을 참조하세요.
  • Spanner 인스턴스를 쿼리하는 데 필요한 권한을 얻으려면 관리자에게 BigQuery 연결 사용자(roles/bigquery.connectionUser) Identity and Access Management(IAM) 역할을 부여해 달라고 요청하세요. 또한 다음 중 하나를 부여하도록 관리자에게 요청해야 합니다.
    • 세분화된 액세스 제어 사용자는 쿼리의 모든 Spanner 스키마 객체에 대한 SELECT 권한이 있는 데이터베이스 역할에 액세스해야 합니다.
    • 세분화된 액세스 제어 사용자가 아니면 Cloud Spanner 데이터베이스 리더 (roles/spanner.databaseReader) IAM 역할이 필요합니다.

    IAM 역할 부여에 대한 자세한 내은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요. 세분화된 액세스 제어에 대한 자세한 내용은 세분화된 액세스 제어 정보를 참조하세요.

올바른 연결 선택

Spanner 세분화된 액세스 제어 사용자인 경우 EXTERNAL_QUERY 함수로 제휴 쿼리를 실행할 때 데이터베이스 역할을 지정하는 Spanner 연결을 사용해야 합니다. 그러면 이 연결로 실행하는 모든 쿼리에 해당 데이터베이스 역할이 사용됩니다.

데이터베이스 역할을 지정하지 않는 연결을 사용하는 경우 시작하기 전에에 IAM 역할이 표시되어 있어야 합니다.

데이터 쿼리

GoogleSQL 쿼리에서 Spanner로 통합 쿼리를 보내려면 EXTERNAL_QUERY 함수를 사용합니다.

데이터베이스의 지정된 언어에 따라 GoogleSQL 또는 PostgreSQL로 Spanner 쿼리를 작성합니다.

다음 예시에서는 orders라는 Spanner 데이터베이스에 통합 쿼리를 수행하고 결과를 mydataset.customers라는 BigQuery 테이블과 조인합니다.

SELECT c.customer_id, c.name, rq.first_order_date
FROM mydataset.customers AS c
LEFT OUTER JOIN EXTERNAL_QUERY(
  'my-project.us.example-db',
  '''SELECT customer_id, MIN(order_date) AS first_order_date
  FROM orders
  GROUP BY customer_id''') AS rq
  ON rq.customer_id = c.customer_id
GROUP BY c.customer_id, c.name, rq.first_order_date;

Spanner Data Boost

Data Boost는 지원되는 Spanner 워크로드에 독립적인 컴퓨팅 리소스를 제공하는 완전 관리형 서버리스 기능입니다. Data Boost를 사용하면 프로비저닝된 Spanner 인스턴스의 기존 워크로드에 거의 영향을 주지 않고 분석 쿼리 및 데이터 내보내기를 실행할 수 있습니다. Data Boost를 사용하면 프로비저닝된 인스턴스와 별개로 독립적인 컴퓨팅 용량을 사용하여 통합 쿼리를 실행할 수 있으므로 Spanner의 기존 워크로드에 영향을 주지 않습니다. Data Boost는 복잡한 임시 쿼리를 실행하거나 기존 Spanner 워크로드에 영향을 주지 않고 대량의 데이터를 처리하려는 경우에 가장 효과적입니다. Data Boost로 통합 쿼리를 실행하면 CPU 소비를 크게 줄이고 경우에 따라 쿼리 지연 시간을 줄일 수 있습니다.

시작하기 전에

Data Boost에 대한 액세스를 사용 설정하는 데 필요한 권한을 얻으려면 관리자에게 Spanner 데이터베이스에 대한 DataBoost가 있는 Cloud Spanner 데이터베이스 리더 (roles/spanner.databaseReaderWithDataBoost) IAM 역할을 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

이 사전 정의된 역할에는 Data Boost 액세스를 사용 설정하는 데 필요한 spanner.databases.useDataBoost 권한이 포함되어 있습니다.

커스텀 역할이나 다른 사전 정의된 역할을 사용하여 이 권한을 부여받을 수도 있습니다.

Data Boost 사용 설정

외부 데이터 세트를 사용하는 경우 Data Boost가 항상 사용되며 수동으로 사용 설정할 필요가 없습니다.

EXTERNAL_QUERY 쿼리에 Data Boost를 사용하려면 쿼리에서 사용되는 연결을 만들 때 사용 설정해야 합니다.

동시에 데이터 읽기

Spanner에서는 특정 쿼리를 더 작은 부분이나 파티션 여러 개로 나누고 파티션을 동시에 가져올 수 있습니다. 자세한 내용은 Spanner 문서의 동시에 데이터 읽기를 참조하세요.

하지만 이 옵션은 다음 조건 중 하나를 충족하는 쿼리로 제한됩니다.

  • 실행 계획의 첫 번째 연산자가 분산 통합 연산자입니다.

  • 실행 계획에 분산 통합 연산자가 없습니다.

다른 쿼리는 오류를 반환합니다. Spanner 쿼리의 쿼리 실행 계획을 보려면 Spanner의 쿼리 실행 방법 이해를 참고하세요.

외부 데이터 세트로 제휴 쿼리를 실행할 때는 항상 '데이터를 동시에 읽기' 옵션이 사용됩니다.

EXTERNAL_QUERY를 사용할 때 병렬 읽기를 사용 설정하려면 연결을 만들 때 사용 설정하세요.

쿼리 실행 우선순위 관리

EXTERNAL_QUERY 함수로 제휴 쿼리를 실행할 때 query_execution_priority 옵션을 지정하여 개별 쿼리에 우선순위 (high, medium 또는 low)를 할당할 수 있습니다.

SELECT *
FROM EXTERNAL_QUERY(
  'my-project.us.example-db',
  '''SELECT customer_id, MIN(order_date) AS first_order_date
  FROM orders
  GROUP BY customer_id''',
  '{"query_execution_priority":"high"}');

기본 우선순위는 medium입니다.

우선순위가 high인 쿼리는 트랜잭션 트래픽과 경합합니다. 우선순위가 low인 쿼리는 최대한 노력이 지원되며 예약된 백업과 같은 백그라운드 로드에 의해 선점될 수 있습니다.

외부 데이터 세트로 통합 쿼리를 실행할 때 모든 쿼리는 항상 medium 우선순위가 적용됩니다.

Spanner 테이블 스키마 보기

외부 데이터 세트를 사용하는 경우 Spanner 테이블이 BigQuery 스튜디오에 직접 표시되며 스키마를 볼 수 있습니다.

하지만 외부 데이터 세트를 정의하지 않고도 스키마를 볼 수 있습니다. EXTERNAL_QUERY 함수를 사용하여 information_schema 뷰를 쿼리하여 데이터베이스 메타데이터에 액세스할 수도 있습니다. 다음 예에서는 MyTable 테이블의 열에 대한 정보를 반환합니다.

Google SQL 데이터베이스

SELECT *
FROM EXTERNAL_QUERY(
  'my-project.us.example-db',
  '''SELECT t.column_name, t.spanner_type, t.is_nullable
    FROM information_schema.columns AS t
    WHERE
      t.table_catalog = ''
      AND t.table_schema = ''
     AND t.table_name = 'MyTable'
    ORDER BY t.ordinal_position
  ''');

PostgreSQL 데이터베이스

SELECT * from EXTERNAL_QUERY(
 'my-project.us.postgresql.example-db',
  '''SELECT t.column_name, t.data_type, t.is_nullable
    FROM information_schema.columns AS t
    WHERE
      t.table_schema = 'public' and t.table_name='MyTable'
    ORDER BY t.ordinal_position
  ''');

자세한 내용은 Spanner 문서의 다음 정보 스키마 참조 문서를 확인하세요.

가격 책정

  • BigQuery 측에서는 표준 통합 쿼리 가격 책정이 적용됩니다.
  • Spanner 측에서는 쿼리에 Spanner 가격 책정이 적용됩니다.
  • 미리보기 단계에서 일반 출시 단계로 이동할 때 가격이 변경될 수 있습니다.

문제 해결

이 섹션은 통합 쿼리를 Spanner에 전송할 때 발생할 수 있는 문제를 해결하는 데 도움이 됩니다.

문제: 쿼리를 루트로 분할할 수 없습니다.
해결 방법: 데이터를 병렬로 읽도록 연결을 구성하는 경우 쿼리 실행 계획의 첫 번째 연산자가 분산 통합이거나 실행 계획에 분산 통합이 없어야 합니다. 이 오류를 해결하려면 쿼리 실행 계획을 보고 쿼리를 다시 작성합니다. 자세한 내용은 Spanner의 쿼리 실행 방법 이해를 참조하세요.
문제: 기한이 지났습니다.
해결 방법: 데이터 병렬로 읽기 옵션을 선택하여 루트 분할이 가능한 쿼리를 다시 작성합니다. 자세한 내용은 Spanner의 쿼리 실행 방법 이해를 참조하세요.

다음 단계