BigQuery 价格

如需了解 BigQuery 价格,请参阅本页面。

如需了解 BigQuery ML 价格,请参阅 BigQuery ML 价格页面。

如需了解 BigQuery Data Transfer Service 价格,请参阅 BigQuery Data Transfer Service 价格页面。

概览

BigQuery 提供灵活的价格选项,可以根据您的技术需求与预算进行调整。

存储费用按 BigQuery 中存储的数据量收取,可采用以下付费模式:

  • 活跃 - 对过去 90 天内修改过的表或分区中存储的数据收取的月度费用。
  • 长期 - 对过去 90 天内未修改过的表或分区中存储的数据收取的较低月度费用。

对于查询费用,您可以在下面两种价格模式之间进行选择:

  • 按需价格 - 这是最灵活的选项。按需价格模式根据您运行的每个查询处理的数据量计费。
  • 固定价格 - 这种可预测的价格选项最适合具有固定预算的客户。固定价格客户购买专用资源来处理查询,无需按具体查询付费。

如需详细了解存储和查询价格,请参阅 Google Cloud SKU。请注意,按需查询价格在 SKU 页面上被称为分析价格。

价格摘要

下表汇总了 BigQuery 的价格。这些操作受 BigQuery 配额和限制的约束。

费用结算方式

您创建的每个项目都有与之关联的结算帐号。在项目中运行的 BigQuery 作业所产生的所有费用均会计入关联的结算帐号,BigQuery 存储费用也会计入关联的结算帐号。

如何分析结算数据

您可以在 Cloud Console 中使用“Cloud Billing 报告”页面来查看 BigQuery 费用和趋势。如需了解如何使用报告来分析结算数据,请参阅使用结算报告查看您的费用趋势

如需了解如何在 BigQuery 中分析您的结算数据,请参阅 Cloud Billing 文档中的将结算数据导出到 BigQuery

免费操作

下表列出了我们为各个地区提供的免费 BigQuery 操作。这些操作受 BigQuery 配额和限制的约束。

操作 详细信息
加载数据

在将 Cloud Storage 中的数据加载到 BigQuery 中时,您不需要为加载操作支付费用,但需要支付在 Cloud Storage 中存储数据的费用。如需了解详情,请参阅 Cloud Storage 价格页面上的数据存储,数据一旦加载到 BigQuery 中,就会按照 BigQuery 的存储价格计费。 如需了解详情,请参阅将数据加载到 BigQuery 中

在 BigQuery 中创建数据集时,您必须为数据选择一个位置。如果您选择 US,则可以将来自其他任何区域的 Cloud Storage 存储分区的数据加载到该数据集所含的表中。目前,将来自其他区域的数据加载到位置为美国的数据集时,系统不会对互联网出站流量收费。

如果您选择的位置不是 US,则您必须执行以下操作之一:

  • 从该区域的 Cloud Storage 存储分区加载数据(此存储分区可以是一个多区域型存储分区,也可以是数据集所在区域的一个区域型存储分区)
  • 将数据复制到该区域的一个存储分区中

如果您将某个 Cloud Storage 区域的数据复制到另一个 Cloud Storage 区域,则系统会按 Cloud Storage 网络流量价格收费。

复制数据 您不需要为复制表的操作支付费用,但需要支付新表和所复制表的存储费用。如需了解详情,请参阅复制现有的表
导出数据 在将 BigQuery 中的数据导出到 Cloud Storage 时,您不需要为导出操作支付费用,但需要支付在 Cloud Storage 中存储数据的费用。如需了解详情,请参阅 Cloud Storage 价格页面上的数据存储,以及从 BigQuery 导出数据
删除数据集 您不需要为删除数据集的操作支付费用。
删除表、视图、分区和函数 您不需要为删除表、视图、各个表分区或用户定义函数的操作支付费用。
元数据操作 您不需要为 list、get、patch、update 和 delete 调用支付费用。示例包括(但不限于):列出数据集、更新数据集的访问控制列表、更新表的说明或列出数据集内的用户定义函数。
读取伪列 您不需要为查询以下伪列的内容支付费用:
_TABLE_SUFFIX - 在查询通配符表时使用,或用于在标准 SQL 中实现表修饰器语义 _PARTITIONDATE - 在查询提取时间分区表时使用 _PARTITIONTIME - 在查询提取时间分区表时使用 _FILE_NAME - 在查询基于外部数据源的表时使用
读取元表 您不需要为查询以下元表的内容支付费用:
__PARTITIONS_SUMMARY__ - 在获取分区表或提取时间分区表中分区的相关元数据时使用 __TABLES_SUMMARY__ - 在获取数据集内表和视图的相关元数据时使用
创建、替换或调用 UDF 目前,您无需为创建、替换或调用永久性用户定义函数 (UDF) 支付费用。永久性 UDF 目前为测试版;价格可能会发生变化。

“始终免费”用量限制

Google Cloud 免费层级下,BigQuery 会提供一些免费资源,但用量不能超过特定限额。这些免费资源的用量限额在免费试用期间及试用结束后均有效。如果超过这些用量限额且免费试用期已过,您将需要根据本页中列出的价格支付费用。

资源 每月免费用量上限 详细信息
存储 每月前 10 GB 数据免费。 存储在 BigQuery 中的 BigQuery ML 模型和训练数据会计入 BigQuery 存储服务的免费层级。
查询(分析) 每月处理的前 1 TB 查询数据免费。 使用 BigQuery ML 预测、检查和评估功能的查询会计入 BigQuery 分析服务的免费层级。包含 CREATE MODEL 语句的 BigQuery ML 查询不计入免费层级。
BigQuery 还为那些希望月度费用稳定在一定水平的高用量客户提供固定价格
BigQuery ML CREATE MODEL 查询 包含 CREATE MODEL 语句的查询每月处理的前 10 GB 数据免费。 BigQuery ML CREATE MODEL 查询不计入 BigQuery 分析服务的免费层级。

查询价格

查询价格是指运行您的 SQL 命令、用户定义函数以及限定的数据操纵语言 (DML)数据定义语言 (DDL) 语句而产生的费用。

BigQuery 提供两种价格模式供您选择:

  • 按需价格模式灵活而高效,您只需为运行的查询付费。
  • 固定价格模式提供可预测且一致的月度费用。

默认情况下,系统以按需价格模式结算。您可以根据自己的需求选择相应的价格模式。您还可以为每个项目和每个位置混合搭配两种价格模式。

按需价格

在按需价格模式下,BigQuery 按处理的字节数(也称为读取的字节数)收取查询费用。无论您是将数据存储在 BigQuery 中,还是存储在外部数据源(例如 Cloud Storage、Google 云端硬盘或 Cloud Bigtable)中,我们都会根据处理的字节数向您收取费用。按需价格仅按用量计算。

按需查询价格如下所示:

请注意以下有关查询费用的事项:

  • BigQuery 使用列式数据结构。我们会根据您选择的列中处理的总数据量向您收费,而每列的总数据量是基于该列中的数据类型计算的。如需详细了解我们如何计算您的数据大小,请参阅数据大小计算
  • 您不需要为返回错误的查询或从缓存中检索结果的查询付费。
  • 系统在计算费用时会四舍五入到最接近的 MB 数,查询引用的每个表所处理的数据至少计为 10 MB,每个查询所处理的数据也至少计为 10 MB。
  • 取消正在运行的查询作业可能会产生费用,费用最高可达正常完成查询所需的全部费用。
  • 在运行查询时,即使您对结果数量设置了明确的 LIMIT,我们也会根据您选择的列中处理的数据量向您收费。
  • 对表进行分区聚簇有助于减少查询处理的数据量。分区和聚簇是最佳做法,请尽量加以使用。
  • 按需查询价格在 Google Cloud Platform SKU 页面上被称为分析价格。

按需查询费用控制条件

BigQuery 提供了费用控制机制,可让您为查询费用设置上限。您可以进行以下设置:

查询 Cloud Storage 数据

从 BigQuery 查询外部数据源时,您需要根据查询读取的字节数付费。如需了解详情,请参阅查询价格。您还需要为在 Cloud Storage 上存储数据支付费用。如需了解详情,请参阅 Cloud Storage 价格

查询 Cloud Storage 中的列式格式

如果外部数据存储在 ORC 或 Parquet 中,则您只需为 BigQuery 读取的列中的字节数付费。由于查询会将来自外部数据源的数据类型转换为 BigQuery 数据类型,因此读取的字节数将根据 BigQuery 数据类型的大小来计算。如需了解数据类型转换,请参阅以下页面:

Cloud Storage 上外部分区数据的价格

如果查询 Cloud Storage 上存储的 Hive 分区表,则需要额外付费。

BigQuery 会计算未剪除的文件名长度的总和(以字节为单位)。系统在计算 Hive 分区的总费用时会四舍五入到最接近的 MB 数,查询中包含的每个 Hive 分区表处理的数据至少计为 10 MB。

固定价格

BigQuery 为具备以下特点的客户提供了固定价格模式:更希望每月支付稳定的查询费用,而不是根据处理的数据量(TB 数)以按需计费的方式支付费用。

您可以选择通过 BigQuery 预留来使用固定价格模式。

当您注册固定价格方案时,您将以 BigQuery 为单位购买槽承诺使用合约(即专用的查询处理能力)。您的查询会使用此容量,而您无需为处理的字节数付费。如果您的容量需求超出承诺容量,BigQuery 会使槽排队,而您无需额外付费。请参阅 BigQuery ,详细了解 BigQuery 如何使用槽来处理查询。

固定价格:

  • 涵盖查询费用,包括 BigQuery ML、DML 和 DDL 语句。
  • 不涵盖存储流式提取和 BI Engine 费用。
  • 作为区域性资源购买。在一个区域购买的槽承诺使用合约无法在另一个区域使用,也无法移动。
  • 客户可以联系 Google Cloud Platform 支持团队提高每个项目的并发配额。
  • 可选择月度合约和年度合约。
  • 可在整个组织共享。无需为每个项目购买槽承诺使用合约

每月固定价格承诺使用合约

当您注册固定价格方案时,您将以 BigQuery 槽为单位购买槽承诺使用合约。槽承诺使用合约最少包含 500 个槽。在承诺使用合约期间,您需要按秒付费。下表显示了每月槽承诺使用合约的费用。

每年固定价格承诺使用合约

当您注册固定价格方案时,您将以 BigQuery 槽 为单位购买槽承诺使用合约。槽承诺使用合约最少包含 500 个槽。下表显示了每年槽承诺使用合约的费用。注册了每年承诺使用合约后,在承诺使用合约期间,您需要按秒付费。

存储价格

数据一旦加载到 BigQuery 中,您就需要支付相关的存储费用。存储价格根据您表中所存储的数据在未压缩时的大小计算。

数据大小根据各列的数据类型计算。如需详细了解我们如何计算数据大小,请参阅数据大小计算

活跃存储

活跃存储费用如下所示:

存储价格基于每秒每 MB 的价格按比例计算。例如,如果您的存储情况如下:

  • 存储 100 MB 半个月,则需要支付 $0.001(十分之一美分)
  • 存储 500 GB 半个月,则需要支付 $5
  • 存储 1 TB 一整月,则需要支付 $20

长期存储

如果一个表连续 90 天未发生修改,则该表的存储价格会自动下降 50% 左右。某表被视为长期存储后,不会出现性能、耐用性、可用性和任何其他功能方面的降级。

长期存储价格如下所示:

如果表发生了修改,价格会恢复到常规的存储价格,且 90 天连续未修改时间的计时器从零开始重新计数。对表中数据进行任何修改都会重置该计时器,包括:

操作 详细信息
将数据加载到表中 通过任何加载或查询作业将数据附加到目标表或覆盖目标表。
将数据复制到表中 通过任何复制作业将数据附加到目标表或覆盖目标表。
将查询结果写入表中 通过任何查询作业将数据附加到目标表或覆盖目标表。
使用数据操纵语言 (DML) 使用 DML 语句修改表数据。
使用数据定义语言 (DDL) 使用“CREATE OR REPLACE TABLE”DDL 语句替换表。
将数据流式插入到表中 使用 tabledata.insertAll API 调用提取数据。

其他所有操作均不会重置计时器,包括:

  • 查询表
  • 创建表查询视图
  • 从表中导出数据
  • 复制表(至另一个目标表)
  • 修补或更新表资源

对于分区表,它的每一个分区都会被视为单独的个体来判断是否适用长期存储价格。如果某个分区在过去 90 天内未被修改,则该分区中的数据将被视为长期存储并按折扣价计费。

对于在结算周期内达到 90 天阈值的表,我们会相应地按比例计算其价格。

长期存储价格仅适用于 BigQuery 存储,不适用于外部数据源中存储的数据,这些数据源包括 Cloud Bigtable、Cloud Storage 和 Google 云端硬盘等。

BigQuery Storage API 价格

BigQuery Storage API 采用按需价格模式。您需要为读取的数据量付费。采用固定价格模式的客户每月最多可以使用 BigQuery Storage API 免费读取 300 TB 的数据。对于每月超过 300 TB 额度的部分,系统将按照按需费率进行计费。

按需价格

在按需价格模式下,您的 BigQuery Storage API 费用基于调用 ReadRows 从 BigQuery 存储空间读取的字节数计算。

读取的字节数包括用于过滤但未作为 ReadRows 输出返回给您的数据。从临时表中读取数据不需要付费。

BigQuery Storage API 的按需费用如下所示:

请注意以下与 BigQuery Storage API 费用有关的事项:

  • 您需要根据读取的数据总量付费。读取的每列数据总量是根据列中数据的类型计算的,而数据的大小是根据列的数据类型计算的。如需详细了解数据大小的计算方式,请参阅数据大小计算
  • 即使 ReadRows 调用失败,您也需要为读取会话中读取的所有数据付费。
  • 如果您在数据流传输完毕之前取消 ReadRows 调用,则需要为取消前读取的所有数据付费。您的费用可能包括取消 ReadRows 调用之前已读取但未返回给您的数据。
  • 对表进行分区和聚簇是最佳做法,请尽量加以使用。您可以使用 WHERE 子句来剪除分区,以减少读取的数据量。如需了解详情,请参阅查询分区表

数据大小计算

当您将数据加载到 BigQuery 中或查询数据时,我们会根据数据大小向您收取费用。数据大小是基于每个列的数据类型的大小计算的。

所存储数据的大小以及您的查询所处理的数据大小以千兆字节 (GB) 为单位计算,其中 1 GB 为 230 个字节。此计量单位也称为吉比字节 (GiB)。与之类似,1 TB 为 240 个字节 (1024 GB)。

BigQuery 的数据类型的大小如下所示:

数据类型 大小
INT64/INTEGER 8 个字节
FLOAT64/FLOAT 8 个字节
NUMERIC 16 个字节
BOOL/BOOLEAN 1 个字节
STRING 2 个字节 + UTF-8 编码字符串大小
BYTES 2 个字节 + 值中的字节数
DATE 8 个字节
DATETIME 8 个字节
TIME 8 个字节
TIMESTAMP 8 个字节
STRUCT/RECORD 0 个字节 + 包含的字段的大小
GEOGRAPHY 16 个字节 + 24 个字节 * geography 类型的数据中的顶点数量(您可以使用 ST_NumPoints 函数验证顶点数量)

所有数据类型的 null 值均计为 0 个字节。

重复列以数组形式存储,大小根据值的数量计算。例如,如果整数列 (INT64) 重复 (ARRAY<INT64>) 且包含 4 个条目,则系统会将该列计算为 32 个字节(即 4 个条目 x 8 个字节)。

流式插入价格

您可以免费将数据加载到 BigQuery 中,但需要为流式插入的数据支付少许费用。

流式插入的价格如下所示:

数据操纵语言价格

BigQuery 会根据 DML 查询处理的字节数收取查询费用。

针对非分区表的 DML 价格

对于非分区表,处理的字节数按如下方式计算:

DML 语句 处理的字节数
INSERT 执行查询而扫描表时,对表引用的所有列进行处理的总字节数。
UPDATE 执行查询时所扫描的表引用的所有列包含的总字节数
UPDATE 开始时所更新的表中所有列的总字节数之和。
DELETE 执行查询时所扫描的表引用的所有列包含的总字节数
DELETE 开始时所修改的表中所有列的总字节数之和。
MERGE 如果 MERGE 语句中仅包含 INSERT 子句,您需要支付的费用取决于对执行查询时扫描的表中引用的所有列处理的总字节数。
如果 MERGE 语句中包含 UPDATEDELETE 子句,则您需要支付的费用取决于执行查询而扫描源表时对源表引用的所有列进行处理的总字节数
MERGE 开始时目标表中所有列的总字节数之和。

针对分区表的 DML 价格

对于分区表,处理的字节数按如下方式计算:

DML 语句 处理的字节数
INSERT 执行查询而扫描所有分区时,对分区中引用的所有列进行处理的总字节数。
UPDATE 对执行查询时扫描的表的所有分区中引用的所有列处理的总字节数
UPDATE 开始时所更新表的更新或扫描分区中所有列的总字节数之和。
DELETE 对执行查询时扫描的表的所有分区中引用的所有列处理的总字节数
DELETE 开始时所修改表的修改或扫描分区中所有列的总字节数之和。
MERGE 如果 MERGE 语句中仅包含 INSERT 子句,您需要支付的费用将取决于对执行查询时扫描的所有分区中引用的所有列处理的总字节数。
如果 MERGE 语句中包含 UPDATEDELETE 子句,则您需要支付的费用取决于执行查询而扫描源表时对源表的所有分区中引用的所有列进行处理的总字节数
MERGE 开始时目标表的更新、删除或扫描分区中所有列的总字节数之和。

数据定义语言 (DDL) 价格

BigQuery 会根据 DDL 查询处理的字节数收取查询费用。对于 DDL 语句,处理的字节数按如下方式计算:

DDL 语句 处理的字节数
CREATE TABLE 无。
CREATE TABLE ... AS SELECT ... 执行查询而扫描表时,对表引用的所有列进行处理的总字节数。
CREATE VIEW 无。
DROP TABLE 无。
DROP VIEW 无。

聚簇表价格

在 BigQuery 中创建和使用聚簇表时,您要支付的费用取决于表中存储的数据量以及您对数据执行的查询。聚簇表可通过剪除数据来使这些数据不会被查询处理,从而帮助您降低查询费用。此过程称为块剪除。

块剪除

BigQuery 会根据聚簇列中的值对聚簇表中的数据排序,并将这些数据整理为块的形式。

当您提交包含对聚簇列进行过滤的查询时,BigQuery 会使用聚簇信息高效地确定某个块是否包含与查询相关的任何数据。这样一来,BigQuery 就可以仅扫描相关块(此过程称为块剪除)。

查询价格基于处理的字节数。如果您对聚簇表运行查询,并且此查询包含针对聚簇列的过滤条件,则 BigQuery 会使用过滤条件表达式和块元数据来剪除查询要扫描的块。

当某个块被剪除后,系统不会对其进行扫描。只有经过扫描的块才会计入查询所处理的数据量(以字节为单位)。对聚簇表运行的查询所处理的字节数,等于系统在所扫描的块内从该查询引用的每个列中读取的字节总数。

如果聚簇表在使用了多个过滤条件的查询中被引用了多次,则 BigQuery 会分别收取各个过滤条件下相应块中列的扫描费用。

脚本价格

在 BigQuery 脚本测试版期间,由于执行脚本之前脚本扫描的字节数通常为未知数,因此 BigQuery 团队建议您为项目采用固定价格模式,以避免产生意料之外的查询费用。或者,您也可以通过 BigQuery 沙盒免费享用有限的脚本执行次数。今后,BigQuery 团队将让您能够更明确地控制脚本扫描的总字节数和脚本中的各个语句。此为测试版;如需了解最新的价格信息,请参阅 BigQuery 版本说明

如果脚本失败,失败前执行的所有语句仍会产生相关费用。失败的语句不会产生任何费用。

对于 SELECT、INSERT、UPDATE 等公开发布的语句类型,执行语句的费用按公开价格文档中的规定收取。对于特定于脚本的语句类型,按如下方式收费:

  • DECLARE:针对 DEFAULT 表达式中引用的所有表扫描的总字节数。未引用表的 DECLARE 语句不会产生费用。
  • SET:针对该表达式中引用的所有表扫描的总字节数。未引用表的 SET 语句不会产生费用。
  • IF:针对该条件表达式中引用的所有表扫描的总字节数。未引用表的 IF 条件表达式不会产生费用。IF 块中任何未执行的语句都不会产生费用。
  • WHILE:针对该条件表达式中引用的所有表扫描的总字节数。该条件表达式中未引用表的 WHILE 语句不会产生费用。WHILE 块中任何未执行的语句都不会产生费用。
  • CONTINUE/ITERATE:无相关费用。
  • BREAK/LEAVE:无相关费用。
  • BEGIN/END:无相关费用。

脚本运行过程中,临时表不会产生存储费用。但是,对于创建、修改或查询表的任何语句,都会产生常规费用。

BigQuery 价格示例

估算查询费用

如需查询价格示例,请参阅估算查询费用

估算存储费用

如需存储价格示例,请参阅估算存储费用

针对非分区表的 DML 价格示例

以下示例演示了 BigQuery 如何计算 DML 语句在修改非分区表时所读取的字节数。

示例 1:对非分区表调用 UPDATE 语句

table1 含有两列:col1(类型为 INTEGER)和 col2(类型为 STRING)。

UPDATE table1 SET col1 = 1 WHERE col2 = 2;

本示例中处理的字节数 =

  • col1 中的总字节数 +
  • col2 中的总字节数

示例 2:对非分区表调用 UPDATE 语句

table1 含有两列:col1(类型为 INTEGER)和 col2(类型为 STRING)。table2 含有一列:field1(类型为 INTEGER)。

UPDATE table1 SET col1 = 1 WHERE col1 in (SELECT field1 from table2)

本示例中处理的字节数 =

  • UPDATE 之前 table1.col1 中的总字节数 +
  • UPDATE 之前 table1.col2 中的总字节数 +
  • table2.field1 中的总字节数

针对分区表的 DML 价格示例

以下示例演示了 BigQuery 如何计算 DML 语句在修改提取时间分区表和分区表时所读取的字节数。要查看示例中所用表的 JSON 架构表示形式,请参阅“使用 DML 语句更新分区表数据”页面上的示例使用的表

示例 1:对提取时间分区表调用 INSERT 语句

mytable2 含有两列:id(类型为 INTEGER)和 ts(类型为 TIMESTAMP)。mytable 含有两列:field1(类型为 INTEGER)和 field2(类型为 STRING)。

INSERT INTO mytable (_PARTITIONTIME, field1) AS SELECT TIMESTAMP(DATE(ts)), id from mytable2

本示例中处理的字节数 =

  • mytable2.ts 中的总字节数 +
  • mytable2.id 中的总字节数

将要插入行的表 (mytable) 的大小不会影响查询费用。

示例 2:对分区表调用 INSERT 语句

mytable2 含有两列:id(类型为 INTEGER)和 ts(类型为 TIMESTAMP)。mycolumntable 含有四列:field1(类型为 INTEGER)、field2(类型为 STRING)、field3(类型为 BOOLEAN)和 ts(类型为 TIMESTAMP)。

INSERT INTO mycolumntable (ts, field1) AS SELECT ts, id from mytable2

本示例中处理的字节数 =

  • mytable2.ts 中的总字节数 +
  • mytable2.id 中的总字节数

将要插入行的表 (mycolumntable) 的大小不会影响查询费用。

示例 3:对提取时间分区表调用 UPDATE 语句

DML 语句 1:更新单个分区

mytable2 含有两列:id(类型为 INTEGER)和 ts(类型为 TIMESTAMP)。mytable 含有两列:field1(类型为 INTEGER)和 field2(类型为 STRING)。

UPDATE project.mydataset.mytable T SET T.field1 = T.field1 + 100 WHERE T._PARTITIONTIME = TIMESTAMP(“2017-05-01”) AND EXISTS (SELECT S.id from project.mydataset.mytable2 S WHERE S.id = T.field1)

本示例中处理的字节数 =

  • mytable2.id 中的总字节数 +
  • “2017-05-01”分区内 mytable.field1 中的总字节数 +
  • “2017-05-01”分区内 mytable.field2 中的总字节数

DML 语句 2:根据表的一个分区更新另一个分区

UPDATE project.mydataset.mytable T SET T._PARTITIONTIME = TIMESTAMP(“2017-06-01”), T.field1 = T.field1 + 100 WHERE T._PARTITIONTIME = TIMESTAMP(“2017-05-01”) AND EXISTS (SELECT 1 from project.mydataset.mytable S WHERE S.field1 = T.field1 AND S._PARTITIONTIME = TIMESTAMP("2017-06-01") )

本示例中处理的字节数 =

  • “2017-05-01”分区内 mytable.field1 中的总字节数 +
  • “2017-05-01”分区内 mytable.field2 中的总字节数 +
  • “2017-06-01”分区内 mytable.field1 中的总字节数 +
  • “2017-06-01”分区内 mytable.field2 中的总字节数

在本示例中,UPDATE 语句的费用取决于“2017-05-01”和“2017-06-01”所对应的分区中所有字段的大小总和。

示例 4:对分区表调用 UPDATE 语句

DML 语句 1:更新单个分区

mytable2 含有两列:id(类型为 INTEGER)和 ts(类型为 TIMESTAMP)。mycolumntable 含有四列:field1(类型为 INTEGER)、field2(类型为 STRING)、field3(类型为 BOOLEAN)和 ts(类型为 TIMESTAMP)。

UPDATE project.mydataset.mycolumntable T SET T.field1 = T.field1 + 100 WHERE DATE(T.ts) = “2017-05-01” AND EXISTS (SELECT S.id from project.mydataset.mytable2 S WHERE S.id = T.field1)

本示例中处理的字节数 =

  • mytable2.id 中的总字节数 +
  • “2017-05-01”分区内 mycolumntable.field1 中的总字节数 +
  • “2017-05-01”分区内 mycolumntable.field2 中的总字节数 +
  • “2017-05-01”分区内 mycolumntable.field3 中的总字节数 +
  • “2017-05-01”分区内 mycolumntable.ts 中的总字节数

DML 语句 2:根据表的一个分区更新另一个分区

UPDATE project.mydataset.mycolumntable T SET T.ts = TIMESTAMP(“2017-06-01”), T.field1 = T.field1 + 100 WHERE DATE(T.ts) = “2017-05-01” AND EXISTS (SELECT 1 from project.mydataset.mycolumntable S WHERE S.field1 = T.field1 AND DATE(S.ts) = "2017-06-01")

本示例中处理的字节数 =

  • “2017-05-01”分区内 mycolumntable.field1 中的总字节数 +
  • “2017-05-01”分区内 mycolumntable.field2 中的总字节数 +
  • “2017-05-01”分区内 mycolumntable.field3 中的总字节数 +
  • “2017-05-01”分区内 mycolumntable.ts 中的总字节数 +
  • “2017-06-01”分区内 mycolumntable.field1 中的总字节数 +
  • “2017-06-01”分区内 mycolumntable.field2 中的总字节数 +
  • “2017-06-01”分区内 mycolumntable.field3 中的总字节数 +
  • “2017-06-01”分区内 mycolumntable.ts 中的总字节数

在本示例中,UPDATE 语句的费用取决于“2017-05-01”和“2017-06-01”所对应的分区中所有字段的大小总和。

示例 5:对提取时间分区表调用 DELETE 语句

mytable2 含有两列:id(类型为 INTEGER)和 ts(类型为 TIMESTAMP)。mytable 含有两列:field1(类型为 INTEGER)和 field2(类型为 STRING)。

DELETE project.mydataset.mytable T WHERE T._PARTITIONTIME = TIMESTAMP(“2017-05-01”) AND EXISTS (SELECT S.id from project.mydataset.mytable2 S WHERE S.id = T.field1)

本示例中处理的字节数 =

  • mytable2.id 中的总字节数 +
  • “2017-05-01”分区内 mytable.field1 中的总字节数 +
  • “2017-05-01”分区内 mytable.field2 中的总字节数

示例 6:对分区表调用 DELETE 语句

mytable2 含有两列:id(类型为 INTEGER)和 ts(类型为 TIMESTAMP)。mycolumntable 含有四列:field1(类型为 INTEGER)、field2(类型为 STRING)、field3(类型为 BOOLEAN)和 ts(类型为 TIMESTAMP)。

DELETE project.mydataset.mycolumntable T WHERE DATE(T.ts) =“2017-05-01” AND EXISTS (SELECT S.id from project.mydataset.mytable2 S WHERE S.id = T.field1)

本示例中处理的字节数 =

  • mytable2.id 中的总字节数 +
  • “2017-05-01”分区内 mycolumntable.field1 中的总字节数 +
  • “2017-05-01”分区内 mycolumntable.field2 中的总字节数 +
  • “2017-05-01”分区内 mycolumntable.field3 中的总字节数 +
  • “2017-05-01”分区内 mycolumntable.ts 中的总字节数

聚簇表价格示例

您有一个名为 ClusteredSalesData 的聚簇表。该表按 timestamp 列分区,并按 customer_id 列聚簇。数据整理到下面这些块中:

分区标识符 块 ID 块中 customer_id 的最小值 块中 customer_id 的最大值
20160501 B1 10000 19999
20160501 B2 20000 24999
20160502 B3 15000 17999
20160501 B4 22000 27999

您对该表运行以下查询。此查询包含对 customer_id 列应用的过滤条件。

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  customer_id BETWEEN 20000
  AND 23000
  AND DATE(timestamp) = "2016-05-01"

此查询执行以下操作:

  • 扫描 B2 和 B4 块中的 timestampcustomer_idtotalSale 列。
  • 剪除 B3 块,因为在 timestamp 聚簇列上应用了 DATE(timestamp) = "2016-05-01" 过滤条件谓语。
  • 剪除 B1 块,因为在customer_id 聚簇列上应用了 customer_id BETWEEN 20000 AND 23000 过滤条件谓语。

脚本价格示例

在以下示例脚本中,每个语句上方都包含注释,说明了其下的语句会产生哪些费用(如果有)。

-- No cost, since no tables are referenced.
DECLARE x DATE DEFAULT CURRENT_DATE();
-- Incurs the cost of scanning string_col from dataset.table.
DECLARE y STRING DEFAULT (SELECT MAX(string_col) FROM dataset.table);
-- Incurs the cost of copying the data from dataset.big_table.  Once the
-- table is created, you are not charged for storage while the rest of the
-- script runs.
CREATE TEMP TABLE t AS SELECT * FROM dataset.big_table;
-- Incurs the cost of scanning column1 from temporary table t.
SELECT column1 FROM t;
-- No cost, since y = 'foo' doesn't reference a table.
IF y = 'foo' THEN
  -- Incurs the cost of scanning all columns from dataset.other_table, if
  -- y was equal to 'foo', or otherwise no cost since it is not executed.
  SELECT * FROM dataset.other_table;
ELSE
  -- Incurs the cost of scanning all columns from dataset.different_table, if
  -- y was not equal to 'foo', or otherwise no cost since it is not executed.
  UPDATE dataset.different_table
  SET col = 10
  WHERE true;
END IF;
-- Incurs the cost of scanning date_col from dataset.table for each
-- iteration of the loop.
WHILE x < (SELECT MIN(date_col) FROM dataset.table) DO
  -- No cost, since the expression does not reference any tables.
  SET x = DATE_ADD(x, INTERVAL 1 DAY);
  -- No cost, since the expression does not reference any tables.
  IF true THEN
    -- LEAVE has no associated cost.
    LEAVE;
  END IF;
  -- Never executed, since the IF branch is always taken, so does not incur
  -- a cost.
  SELECT * FROM dataset.big_table;
END WHILE;
此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面