全球查询

借助全局查询,您可以运行引用存储在多个区域中的数据的 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 角色,请按以下步骤操作:

  1. 创建自定义角色,例如“BigQuery 全局查询执行者”。
  2. 向此角色添加 bigquery.jobs.createGlobalQuery
  3. 将此角色分配给所选用户或服务账号。

查询数据

如需运行全局查询,您可以像数据位于单个位置时一样编写 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

自动位置选择

在以下情况下,必须执行查询的位置由系统自动确定,且无法更改:

  • 数据修改语言查询(INSERTUPDATEDELETE 语句)始终在目标表的位置执行。
  • 数据定义语言查询(例如 CREATE TABLE AS SELECT 语句)始终在创建或修改资源的位置执行。
  • 指定了目标表的查询始终在目标表所在的位置执行。

选择位置

一般来说,您可以决定全局查询的执行位置。在做出该决定时,请考虑以下因素:

  • 全局查询会暂时将数据从一个位置复制到另一个位置。如果您的组织对数据驻留有任何要求,并且您不希望位置 A 中的数据离开位置 A,请将查询位置设置为 A。

  • 为了最大限度地减少位置之间的数据传输量并降低查询费用,请在大多数查询数据所在的区域中运行查询。

假设您有一家网店,并且在 us-central1 位置维护商品列表,但在 us-south1 区域进行交易。如果交易次数多于商品目录中的商品数量,则应在 us-south1 区域中运行查询。

了解全球查询

为了以高效且经济实惠的方式运行全局查询,了解其执行机制非常重要。

如需使用位于不同位置的数据,必须将其复制到一个位置。以下是 BigQuery 执行的全局查询工作流的抽象表示:

  1. 确定查询必须从用户声明自动执行的位置。此位置称为主要位置,查询引用的所有其他位置均为远程位置。
  2. 在每个远程区域中运行子查询,以收集完成主要区域中的查询所需的数据。
  3. 将这些数据从远程位置复制到主要位置。
  4. 将数据保存在主位置的临时表中 8 小时。
  5. 运行最终查询,其中包含主要位置收集的所有数据。
  6. 返回查询结果。

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 的所有内容从美国复制到欧盟。 仅传输所请求的列(col2col3)以及与 WHERE 条件匹配的行(t2.col4 = 'ABC')就足够了。不过,这些称为“下推”的机制取决于查询结构,有时传输的数据量可能很大。我们建议您在少量数据子集上测试全局查询,并确认仅在需要时才传输数据。

可观测性

如需查看发送到远程区域的查询文本,请查看作业历史记录。远程作业的作业 ID 与原始查询的作业 ID 相同,但附加了 _xregion 后缀。

关闭全局查询

如需为项目或组织停用全局查询,请使用 ALTER PROJECT SET OPTIONS statementALTER ORGANIZATION SET OPTIONS statement 更改默认配置

  • 如需在某个区域中关闭全局查询,请将该区域中的 enable_global_queries_execution 实参设置为 falseNULL
  • 如需禁止全局查询从某个区域复制数据,请在该区域中将 enable_global_queries_data_access 实参设置为 falseNULL

以下示例展示了如何在项目级层停用全局查询:

ALTER PROJECT PROJECT_ID
SET 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 表的列时,您不能使用 RANGEINTERVAL 字面量。
  • 不支持全局授权视图授权例程(即,当一个位置的视图或例程被授权访问另一个位置的数据集时)。
  • 不支持基于全局查询的具体化视图
  • 如果全局查询引用 STRUCT 列,则系统不会对任何远程子查询应用下推。为了优化性能,请考虑在远程区域中创建一个视图,用于过滤 STRUCT 列,并仅以单独的列形式返回必要的字段。
  • 全局查询不会以原子方式执行。如果数据复制成功,但整个查询失败,您仍需支付数据复制费用。
  • 在远程区域中创建的临时表(作为执行全局查询的一部分)只有在以下情况下才会使用客户管理的加密密钥 (CMEK) 进行加密:配置用于加密全局查询结果的 CMEK 密钥(在表、数据集或项目级层)是全球性的。为确保远程临时表始终受到 CMEK 保护,请为在远程区域中运行全局查询的项目设置默认 KMS 密钥。
  • Assured Workloads 不支持全局查询。
  • 在全局查询中,您最多可以查询每个区域中的 10 个表。