全球查询
借助全局查询,您可以运行引用存储在多个区域中的数据的 SQL 查询。例如,您可以运行一个全局查询,将位于 us-central1 中的表与位于 europe-central2 中的表联接起来。本文档介绍了如何在项目中启用和运行全局查询。
准备工作
验证是否已为您的项目启用全局查询,并确保您拥有运行全局查询的必要权限。
启用全局查询
如需为项目或组织启用全局查询,请使用 ALTER PROJECT SET OPTIONS 语句或 ALTER ORGANIZATION SET OPTIONS 语句更改默认配置。
- 如需在某个区域中运行全局查询,请在运行查询的项目中将
enable_global_queries_execution实参设置为true。 - 如需允许全局查询从某个区域复制数据,请在存储数据的项目中将该区域的
enable_global_queries_data_access实参设置为true。 - 全局查询可以在一个项目中运行,并从另一个项目的其他区域提取数据。
以下示例展示了如何在项目级层修改这些设置。假设您想在项目 PROJECT_1_ID 的区域 REGION_1 中运行全局查询,并从项目 PROJECT_2_ID 的区域 REGION_2 中提取数据:
ALTER PROJECT `PROJECT_1_ID` SET OPTIONS ( `region-REGION_1.enable_global_queries_execution` = true ); ALTER PROJECT `PROJECT_2_ID` SET OPTIONS ( `region-REGION_2.enable_global_queries_data_access` = true );
替换以下内容:
PROJECT_1_ID:将运行全局查询的项目的名称REGION_1:将运行全局查询的区域PROJECT_2_ID:全局查询将从中提取数据的项目的名称REGION_2:全球查询将从中提取数据的区域
更改可能需要几分钟才能生效。
所需权限
如需运行全局查询,您必须拥有 bigquery.jobs.createGlobalQuery 权限。BigQuery Admin 角色是唯一包含此权限的预定义角色。如需授予运行全局查询的权限,但不授予 BigQuery Admin 角色,请按以下步骤操作:
- 创建自定义角色,例如“BigQuery 全局查询执行者”。
- 向此角色添加
bigquery.jobs.createGlobalQuery。 - 将此角色分配给所选用户或服务账号。
查询数据
如需运行全局查询,您可以像数据位于单个位置时一样编写 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
自动位置选择
在以下情况下,必须执行查询的位置由系统自动确定,且无法更改:
- 数据修改语言查询(
INSERT、UPDATE、DELETE语句)始终在目标表的位置执行。 - 数据定义语言查询(例如
CREATE TABLE AS SELECT语句)始终在创建或修改资源的位置执行。 - 指定了目标表的查询始终在目标表所在的位置执行。
选择位置
一般来说,您可以决定全局查询的执行位置。在做出该决定时,请考虑以下因素:
全局查询会暂时将数据从一个位置复制到另一个位置。如果您的组织对数据驻留有任何要求,并且您不希望位置 A 中的数据离开位置 A,请将查询位置设置为 A。
为了最大限度地减少位置之间的数据传输量并降低查询费用,请在大多数查询数据所在的区域中运行查询。
假设您有一家网店,并且在 us-central1 位置维护商品列表,但在 us-south1 区域进行交易。如果交易次数多于商品目录中的商品数量,则应在 us-south1 区域中运行查询。
了解全球查询
为了以高效且经济实惠的方式运行全局查询,了解其执行机制非常重要。
如需使用位于不同位置的数据,必须将其复制到一个位置。以下是 BigQuery 执行的全局查询工作流的抽象表示:
- 确定查询必须从用户声明或自动执行的位置。此位置称为主要位置,查询引用的所有其他位置均为远程位置。
- 在每个远程区域中运行子查询,以收集完成主要区域中的查询所需的数据。
- 将这些数据从远程位置复制到主要位置。
- 将数据保存在主位置的临时表中 8 小时。
- 运行最终查询,其中包含主要位置收集的所有数据。
- 返回查询结果。
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 无需将表 t2 的所有内容从美国复制到欧盟。
仅传输所请求的列(col2 和 col3)以及与 WHERE 条件匹配的行(t2.col4 = 'ABC')就足够了。不过,这些称为“下推”的机制取决于查询结构,有时传输的数据量可能很大。我们建议您在少量数据子集上测试全局查询,并确认仅在需要时才传输数据。
可观测性
如需查看发送到远程区域的查询文本,请查看作业历史记录。远程作业的作业 ID 与原始查询的作业 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 PROJECTPROJECT_IDSET OPTIONS ( `region-REGION.enable_global_queries_execution` = false, `region-REGION.enable_global_queries_data_access` = false );
替换以下内容:
PROJECT_ID:要更改的项目的名称REGION:要停用全局查询的区域的名称
更改可能需要几分钟才能生效。
价格
全球查询的费用由以下部分组成:
- 远程位置中每个子查询的计算费用,具体取决于这些位置的价格模式
- 最终查询在执行所在区域的计算费用,具体取决于您在该区域的价格模式
- 根据数据复制价格,在不同位置之间复制数据的费用
- 根据存储空间价格,将数据从远程区域复制到主要区域(8 小时)的存储费用
配额
如需了解有关全局查询的配额,请参阅查询作业。
限制
- 查询的执行详情和执行图不会显示从远程位置处理和传输的字节数。此信息会显示在您可以在作业历史记录中找到的复制作业中。由全局查询创建的复制作业的作业 ID 以查询作业的作业 ID 为前缀。
- 沙盒模式不支持全局查询
- 由于需要在区域之间传输数据,因此与单区域查询相比,全局查询的延迟时间更长。
- 全局查询不使用任何缓存,以避免在区域之间传输数据。
- 您无法使用全局查询来查询伪列(例如
_PARTITIONTIME)。 - 您无法在全局查询中使用灵活的列名称来查询列。
- 在
WHERE子句中引用 BigLake 表的列时,您不能使用RANGE或INTERVAL字面量。 - 不支持全局授权视图和授权例程(即,当一个位置的视图或例程被授权访问另一个位置的数据集时)。
- 不支持基于全局查询的具体化视图。
- 如果全局查询引用
STRUCT列,则系统不会对任何远程子查询应用下推。为了优化性能,请考虑在远程区域中创建一个视图,用于过滤STRUCT列,并仅以单独的列形式返回必要的字段。 - 全局查询不会以原子方式执行。如果数据复制成功,但整个查询失败,您仍需支付数据复制费用。
- 在远程区域中创建的临时表(作为执行全局查询的一部分)只有在以下情况下才会使用客户管理的加密密钥 (CMEK) 进行加密:配置用于加密全局查询结果的 CMEK 密钥(在表、数据集或项目级层)是全球性的。为确保远程临时表始终受到 CMEK 保护,请为在远程区域中运行全局查询的项目设置默认 KMS 密钥。
- Assured Workloads 不支持全局查询。
- 在全局查询中,您最多可以查询每个区域中的 10 个表。