联合查询简介

本页面介绍了如何使用联合查询,并提供了有关如何从 BigQuery 查询 Spanner、AlloyDB 和 Cloud SQL 数据的指导。

借助联合查询,您可以将查询语句发送到 AlloyDB、Spanner 或 Cloud SQL 数据库,并将结果作为临时表返回。联合查询使用 BigQuery Connection API 与 AlloyDB、Spanner 或 Cloud SQL 建立连接。在查询中,您可以使用 EXTERNAL_QUERY 函数,通过该数据库的 SQL 方言向外部数据库发送查询语句。结果将转换为 GoogleSQL 数据类型。

支持的数据存储区

您可以将联合查询与以下数据存储区搭配使用:

工作流程

  • 确定包含您要查询的数据源的 Google Cloud 项目。
  • bigquery.admin 用户在 BigQuery 中创建连接资源。
  • 管理员用户向用户 B 授予使用该连接资源的权限
    • 如果管理员和用户 B 是同一个人,则无需授予权限。
  • 用户 B 使用新的 EXTERNAL_QUERY SQL 函数在 BigQuery 中编写查询。

支持的区域

只有同时支持外部数据源和 BigQuery 的区域才支持联合查询。 如需查看受支持位置的列表,请参阅以下部分:

您可以创建连接并根据以下规则跨区域运行联合查询:

单区域

BigQuery 单区域只能查询同一区域中的资源。

例如,如果您的数据集位于 us-east4,您可以查询位于 us-east4 的 Cloud SQL 实例、AlloyDB 实例或 Spanner 数据库。查询处理位置是 BigQuery 单区域。

多区域

BigQuery 多区域可以查询同一大型地理区域(美国、欧盟)中的任何数据源区域。多区域级位置不适用于 Cloud SQL 实例,因为这些位置仅用于备份。BigQuery 多区域也可以查询同一多区域中的 Spanner 实例。

  • 在 BigQuery 美国多区域中运行的查询可以查询美国地理区域中的任何单个区域,例如 us-central1us-east4us-west2

  • 在 BigQuery 欧盟多区域中运行的查询可以查询欧盟成员国中的任何单个区域,例如 europe-north1europe-west3

  • 查询运行的位置必须与连接资源的位置相同。例如,在美国多区域执行的查询必须使用位于美国多区域的连接。

查询性能因数据集与外部数据源之间的距离而异。例如,美国多区域的数据集与 us-central1 中的 Cloud SQL 实例之间的联合查询速度很快。但是,如果您在美国多区域和 us-east4 中的 Cloud SQL 实例之间运行同一查询,则性能可能会下降。

查询处理位置是多区域位置(USEU)。

数据类型映射

执行联合查询时,外部数据源中的数据将转换为 GoogleSQL 类型。如需了解详情,请参阅 Cloud SQL 联合查询

配额和限制

  • 跨区域联合查询。如果 BigQuery 查询处理位置与外部数据源位置不同,则表示此查询是一个跨区域查询。您每天最多可以为每个项目运行 1 TB 的跨区域查询。 以下是一个跨区域查询示例。
    • Cloud SQL 实例位于 us-west1,而 BigQuery 连接位于美国多区域。BigQuery 查询处理位置是 US
  • 配额。用户应控制外部数据源(例如 Cloud SQL 或 AlloyDB)中的查询配额。联合查询没有额外的配额设置。为了实现工作负载隔离,建议仅查询数据库读取副本。
  • 允许的计费字节数上限。联合查询不支持此字段。您无法在实际执行联合查询之前计算计费字节数。
  • 连接数:一个联合查询最多可以有 10 个唯一连接。
  • Cloud SQL MySQLPostgreSQL。需遵循配额和限制。

限制

联合查询存在以下限制:

  • 性能。联合查询可能不如仅查询 BigQuery 存储那么快。BigQuery 需要等待源数据库执行外部查询并暂时将数据从外部数据源移动到 BigQuery。此外,源数据库可能未针对复杂的分析查询进行优化。

    查询性能还因数据集与外部数据源之间的距离而异。如需了解详情,请参阅支持的区域

  • 联合查询是只读的。在源数据库中执行的外部查询必须是只读的。因此,DML 或 DDL 语句不受支持。

  • 不支持的数据类型。如果外部查询包含 BigQuery 中不支持的数据类型,查询将立即失败。您可以将不受支持的数据类型转换为受支持的其他数据类型。

  • Project 类型的权限。您必须在 Cloud SQL 或 AlloyDB 实例所在的项目中创建连接资源。

价格

  • 如果您使用的是按需价格模式,从 BigQuery 执行联合查询时,需要为从外部查询返回的字节数付费。如需了解详情,请参阅按需分析价格

  • 如果您使用的是 BigQuery 版本,则需要根据所使用的槽数付费。如需了解详情,请参阅容量计算价格

SQL 下推

联合查询受到称为 SQL 下推的优化技术的约束。该技术通过将过滤等操作委托给外部数据源(而不是在 BigQuery 中执行这些操作)来提高查询的性能。减少从外部数据源转移的数据量可以缩短查询执行时间并降低费用。SQL 下推包括列删减(SELECT 子句)和过滤下推(WHERE 子句)。

使用 EXTERNAL_QUERY 函数时,SQL 下推通过重写原始查询来实现。在以下示例中,EXTERNAL_QUERY 函数用于与 Cloud SQL 数据库进行通信:

SELECT COUNT(*)
FROM (
  SELECT * FROM EXTERNAL_QUERY("<connection>", "select * from operations_table")
  )
WHERE a = 'Y' AND b NOT IN ('COMPLETE','CANCELLED');

如果不使用 SQL 下推,以下查询会发送到 Cloud SQL:

SELECT *
FROM operations_table

执行此查询时,即使只需要部分行和列,整个表也会发送回 BigQuery。

如果使用 SQL 下推,以下查询会发送到 Cloud SQL:

SELECT `a`, `b`
FROM (
  SELECT * FROM operations_table) t
WHERE ((`a` = 'Y') AND (NOT `b` IN ('COMPLETE', 'CANCELLED'))

执行此查询时,只有两列以及与过滤谓词匹配的行会发送回 BigQuery。

您可以在查询计划中检查已应用的下推(如果有)。

限制

  • SQL 下推仅适用于 SELECT * FROM T 形式的联合查询。
  • 仅支持列剪除和过滤下推。不支持计算、联接和聚合下推。
  • 对于过滤下推,字面量必须是以下类型之一:BOOLINT64FLOAT64STRINGDATEDATETIMETIMESTAMP。不支持结构体或数组形式的字面量。
  • 仅 AlloyDB、Cloud SQL 和 Spanner 支持 SQL 下推。SAP Datasphere 不支持 SQL 下推。

数据源支持的函数

以下是按数据源支持的 SQL 函数。SAP Datasphere 不支持任何函数。

Cloud SQL MySQL

  • 逻辑运算符ANDORNOT
  • 比较运算符=>>=<<=<>INBETWEENIS NULL
  • 算术运算符:+-*(仅适用于 INT64FLOAT64)。

Cloud SQL PostgreSQL 和 AlloyDB 支持的函数

  • 逻辑运算符ANDORNOT
  • 比较运算符=>>=<<=<>INBETWEENIS NULL
  • 算术运算符+-*/(仅适用于 INT64FLOAT64DATE 类型,DATE 减法除外)。

Spanner:PostgreSQL 方言

  • 逻辑运算符ANDORNOT
  • 比较运算符=>>=<<=<>INBETWEENIS NULL
  • 算术运算符:+-*/(仅适用于 INT64FLOAT64NUMERIC)。

Spanner:GoogleSQL 方言

GoogleSQL 方言支持与 PostgreSQL 方言相同的函数,此外还支持:

  • 安全算术运算符SAFE_ADDSAFE_SUBTRACTSAFE_MULTIPLYSAFE_DIVIDE(仅适用于 INT64FLOAT64NUMERIC)。

后续步骤