联合查询简介
本页面介绍如何使用联合查询,并提供了有关如何从 BigQuery 查询 Spanner 和 Cloud SQL 数据的指导。
借助联合查询,您可以将查询语句发送到 Spanner 或 Cloud SQL 数据库,并将结果作为临时表返回。联合查询使用 BigQuery Connection API 与 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 实例或 Spanner 数据库。查询处理位置是 BigQuery 单区域。
多区域
BigQuery 多区域可以查询同一大型地理区域(美国、欧盟)中的任何数据源区域。多区域位置不适用于 Cloud SQL 实例,因为这些位置仅用于备份。BigQuery 多区域也可以查询同一多区域中的 Spanner 实例。
在 BigQuery 美国多区域中运行的查询可以查询美国地理区域中的任何单个区域,例如
us-central1
、us-east4
或us-west2
。在 BigQuery 欧盟多区域中运行的查询可以查询欧盟成员国中的任何单个区域,例如
europe-north1
或europe-west3
。查询运行的位置必须与连接资源的位置相同。例如,在美国多区域执行的查询必须使用位于美国多区域的连接。
查询性能因数据集与外部数据源之间的距离而异。例如,美国多区域的数据集与 us-central1
中的 Cloud SQL 实例之间的联合查询速度很快。但是,如果您在美国多区域和 us-east4
中的 Cloud SQL 实例之间运行同一查询,则性能可能会下降。
查询处理位置是多地区位置(US
或 EU
)。
数据类型映射
执行联合查询时,外部数据源中的数据将转换为 GoogleSQL 类型。如需了解详情,请参阅 Cloud SQL 联合查询。
配额和限制
- 跨区域联合查询:如果 BigQuery 查询处理位置与外部数据源位置不同,则表示此查询是一个跨区域查询。您每天最多可以为每个项目运行 1 TB 的跨区域查询。 以下是一个跨区域查询示例。
- Cloud SQL 实例位于
us-west1
,而 BigQuery 连接位于美国多区域。BigQuery 查询处理位置是US
。
- Cloud SQL 实例位于
- 配额:用户应控制外部数据源(如 Cloud SQL)中的查询配额。联合查询没有额外的配额设置。为了实现工作负载隔离,建议仅查询数据库读取副本。
- 允许的最大计费字节数:目前联合查询不支持此字段。目前无法在实际执行联合查询之前计算计费字节数。
- 连接数:一个联合查询最多可以有 10 个唯一连接。
- 需遵循 Cloud SQL MySQL 和 PostgreSQL 配额及限制。
限制
联合查询存在以下限制:
性能。联合查询可能不如仅查询 BigQuery 存储那么快。BigQuery 需要等待源数据库执行外部查询并暂时将数据从外部来源移动到 BigQuery。此外,源数据库可能未针对复杂的分析查询进行优化。
查询性能还因数据集与外部数据源之间的距离而异。如需了解详情,请参阅支持的区域。
联合查询是只读的。在源数据库中执行的外部查询必须是只读的。因此,DML 或 DDL 语句不受支持。
不支持的数据类型。如果外部查询包含 BigQuery 中不支持的数据类型,查询将立即失败。您可以将不受支持的数据类型转换为受支持的其他数据类型。
Project 类型的权限。您必须在 Cloud SQL 实例所属的项目中创建连接资源。
价格
如果您使用的是按需价格模式,从 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
形式的联合查询。 - 仅支持列剪除和过滤下推。不支持计算、联接和聚合下推。
- 对于过滤下推,字面量必须是以下类型之一:
BOOL
、INT64
、FLOAT64
、STRING
、DATE
、DATETIME
、TIMESTAMP
。不支持结构体或数组形式的字面量。 - 仅 Cloud SQL 和 Spanner 支持 SQL 下推。SAP Datasphere 不支持 SQL 下推。
数据源支持的函数
以下是按数据源支持的 SQL 函数。SAP Datasphere 不支持任何函数。
Cloud SQL MySQL
- 逻辑运算符:
AND
、OR
、NOT
。 - 比较运算符:
=
、>
、>=
、<
、<=
、<>
、IN
、BETWEEN
、IS NULL
。 - 算术运算符:
+
、-
、*
(仅适用于INT64
和FLOAT64
)。
Cloud SQL PostgreSQL 支持的函数
- 逻辑运算符:
AND
、OR
、NOT
。 - 比较运算符:
=
、>
、>=
、<
、<=
、<>
、IN
、BETWEEN
、IS NULL
。 - 算术运算符:
+
、-
、*
、/
(仅适用于INT64
、FLOAT64
和DATE
类型,DATE
减法除外)。
Spanner - PostgreSQL 方言
- 逻辑运算符:
AND
、OR
、NOT
。 - 比较运算符:
=
、>
、>=
、<
、<=
、<>
、IN
、BETWEEN
、IS NULL
。 - 算术运算符:
+
、-
、*
、/
(仅适用于INT64
、FLOAT64
、NUMERIC
)。
Spanner - GoogleSQL 方言
GoogleSQL 方言支持与 PostgreSQL 方言相同的函数,此外还支持:
- 安全算术运算符:
SAFE_ADD
、SAFE_SUBTRACT
、SAFE_MULTIPLY
、SAFE_DIVIDE
(仅适用于INT64
、FLOAT64
、NUMERIC
)。
后续步骤
- 了解如何查询 SAP Datasphere 数据
- 了解如何查询 Spanner 数据。
- 了解如何查询 Cloud SQL 数据。