Spanner 통합 쿼리

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

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

시작하기 전에

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

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

올바른 연결 선택

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

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

Spanner Data Boost

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

시작하기 전에

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

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

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

Data Boost 사용 설정

Spanner에 대한 통합 쿼리에서 Data Boost를 사용 설정하려면 먼저 Spanner에 연결해야 합니다. 연결 내에서 Data Boost를 사용 설정한 후 데이터를 쿼리하여 통합 쿼리를 Spanner에 보냅니다.

데이터 쿼리

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

통합 쿼리에서 병렬 읽기를 사용 설정하려면 연결 리소스를 만들 때 이 설정을 구성합니다. 이 옵션은 SQL 쿼리를 더 작은 파티션으로 나누고 각 파티션을 동시에 가져옵니다. 하지만 이 옵션은 다음 조건 중 하나를 충족하는 쿼리로 제한됩니다.

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

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

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

쿼리 실행 우선순위 관리

아래 표시된 것처럼 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인 쿼리는 최대한 노력이 지원되며 예약된 백업과 같은 백그라운드 로드에 의해 선점될 수 있습니다.

Spanner 테이블 스키마 보기

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 문서의 다음 정보 스키마 참조 문서를 확인하세요.

문제 해결

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

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

다음 단계