估算和控制费用
本页面介绍了在 BigQuery 中估算和控制费用的最佳实践。
BigQuery 中的主要费用是计算费用(用于查询处理)和存储费用(用于存储在 BigQuery 中的数据)。BigQuery 为查询处理提供了两种类型的价格模式:按需价格和基于容量的价格。每种模式都提供不同的费用控制最佳实践。对于存储在 BigQuery 中的数据,费用取决于为每个数据集配置的存储空间结算模式。
了解 BigQuery 的计算价格
BigQuery 的计算价格存在细微差异,这些差异会影响容量规划和费用控制。
价格模式
对于 BigQuery 中的按需计算,您需要为 BigQuery 查询按 TiB 付费。
或者,对于 BigQuery 中的容量计算,您需要为用于处理查询的计算资源(槽)付费。如需使用此模型,您需要为槽配置预留。
预留具有以下特征:
- 它们以槽池的形式分配,可让您以适合组织的方式管理容量并隔离工作负载。
- 它们必须位于一个管理项目中,并受配额和限制约束。
容量价格模式提供多种版本,所有版本均提供按槽时间(小时)计费的随用随付选项。企业版和企业 Plus 版还提供可选的 1 年期或 3 年期槽承诺,可比随用随付费率节省费用。
您还可以使用随用随付选项设置自动扩缩预留。详情请参阅以下内容:
限制每种模式的费用
使用按需价格模式时,限制费用的唯一方法是配置项目级或用户级每日配额。不过,这些配额会执行强制限额,以防止用户运行超出配额限制的查询。如需设置配额,请参阅创建自定义查询配额。
借助槽预留使用容量价格模式时,需要指定可用于预留的槽数上限。您还可以购买在承诺期限内提供折扣价格的槽承诺。
您可以将预留的基准设置为 0,并将上限设置为满足工作负载需求的设置,从而完全按需使用相应版本。BigQuery 会自动扩容到您的工作负载所需的槽数,绝不会超过您设置的上限。如需了解详情,请参阅使用预留管理工作负载。
控制查询费用
如需控制单个查询的费用,我们建议您先遵循优化查询计算和优化存储方面的最佳实践。
以下部分概述了您可以用于进一步控制查询费用的其他最佳实践。
创建自定义查询配额
最佳实践:使用自定义每日查询配额来限制每日处理的数据量。
您可以设置自定义配额以指定每个项目或每个用户在每日可处理的数据量限额,从而管理费用。达到配额后,用户将无法运行查询。
如需设置自定义配额,您需要具备特定角色或权限。如需了解要设置的配额,请参阅配额和限制。
如需了解详情,请参阅限制每种价格模式的费用。
在运行查询之前检查估算费用
最佳做法:在运行查询前,先进行预览以估算相关费用。
使用按需价格模式时,系统会根据读取的字节数收取查询费用。如需在运行查询之前估算费用,请使用以下方法:
使用查询验证器
在 Google Cloud 控制台中输入查询时,查询验证器会验证查询语法并估算读取的字节数。有了此估算值,您便可在价格计算器中计算查询费用。
如果查询无效,则查询验证器会显示错误消息。例如:
Not found: Table myProject:myDataset.myTable was not found in location US
如果查询有效,则查询验证器会估算处理查询所需的字节数。例如:
This query will process 623.1 KiB when run.
执行试运行
如需执行试运行,请执行以下操作:
控制台
转到 BigQuery 页面。
在查询编辑器中输入查询。
如果查询有效,则会自动显示一个对勾标记以及查询将处理的数据量。如果查询无效,则会显示一个感叹号,并会显示错误消息。
bq
使用 --dry_run
标志输入如下所示的查询。
bq query \ --use_legacy_sql=false \ --dry_run \ 'SELECT COUNTRY, AIRPORT, IATA FROM `project_id`.dataset.airports LIMIT 1000'
对于有效查询,该命令会生成以下响应:
Query successfully validated. Assuming the tables are not modified, running this query will process 10918 bytes of data.
API
如需使用 API 执行试运行,请提交一项查询作业,并在 JobConfiguration 类型中将 dryRun
设置为 true
。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
PHP
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 PHP 设置说明进行操作。 如需了解详情,请参阅 BigQuery PHP API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Python
将 QueryJobConfig.dry_run 属性设置为 True
。如果提供了试运行查询配置,Client.query() 将始终返回已完成的 QueryJob。
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
估算查询费用
使用按需价格模式时,您可以通过计算所处理的字节数来估算运行查询的费用。
按需查询大小计算
如需计算各种类型的查询处理的字节数,请参阅以下部分:
避免运行查询来探索表数据
最佳做法:不要运行查询来探索或预览表数据。
如果您要进行数据实验或探索数据,可以使用表预览选项来查看数据,这种方式是免费的而且不会影响配额。
BigQuery 支持以下数据预览选项:
- 在 Google Cloud 控制台中的表详情页面上,点击预览标签页以对数据进行采样。
- 在 bp 命令行工具中,使用
bq head
命令并指定要预览的行数。 - 在 API 中,使用
tabledata.list
从一组指定的行中检索表数据。 - 避免在非聚簇表中使用
LIMIT
。对于非聚簇表,LIMIT
子句不会降低计算费用。
限制每个查询的结算字节数
最佳实践:在使用按需价格模式时,使用结算字节数上限设置来限制查询费用。
您可以使用结算字节数上限设置来限制对查询结算的字节数。设置结算字节数上限时,将在执行查询之前估算查询将读取的字节数。如果估算的字节数超过了限制,则查询会失败,但不会产生费用。
对于聚簇表,对查询计费的字节数估算值为上限,可能会高于运行查询后实际计费的字节数。因此,在某些情况下,如果设置了结算字节数上限,则对聚簇表运行的查询可能会失败,即使实际结算的字节数不会超过结算字节数上限设置也不例外。
如果查询因结算字节数上限设置而失败,将返回类似如下的错误:
Error: Query exceeded limit for bytes billed: 1000000. 10485760 or higher
required.
如需设置结算字节数上限,请按如下所述操作:
控制台
- 在查询编辑器中,点击更多 > 查询设置 > 高级选项。
- 在结算字节数上限字段中,输入一个整数。
- 点击保存。
bq
使用带有 --maximum_bytes_billed
标志的 bq query
命令。
bq query --maximum_bytes_billed=1000000 \ --use_legacy_sql=false \ 'SELECT word FROM `bigquery-public-data`.samples.shakespeare'
API
在 JobConfigurationQuery
或 QueryRequest
中设置 maximumBytesBilled
属性。
避免在非聚簇表中使用 LIMIT
最佳做法:对于非聚簇表,请勿使用 LIMIT
子句控制费用。
对于非聚簇表,对查询应用 LIMIT
子句不会影响读取的数据量。您需要支付读取查询所指示整个表中的所有字节而产生的费用,即使该查询仅返回子集。对于聚簇表,LIMIT
子句可以减少扫描的字节数,因为扫描足够多的块来获取结果后会停止扫描。您只需为扫描的字节数付费。
分阶段将查询结果具体化
最佳做法:如果可能,请分阶段将查询结果具体化。
如果您创建了一个大型的多阶段查询,则每次运行该查询时,BigQuery 都会读取查询所需的所有数据。这样,您就需要支付查询在每次运行时读取的所有数据所产生的费用。
因此,更好的做法是将查询分为多个阶段,并在每个阶段中通过将查询结果写入一个目标表来将这些结果具体化。 查询较小的目标表可减少数据读取量并降低费用。存储具体化结果的费用远低于处理大量数据的费用。
控制工作负载费用
本部分介绍了在工作负载中控制费用的最佳实践。工作负载是一组相关查询。例如,工作负载可以是每日运行的数据转换流水线、由一组业务分析师运行的一组信息中心,或由一组数据科学家运行的若干个临时查询。
使用 Google Cloud 价格计算器
最佳实践:使用Google Cloud 价格计算器根据预计用量来为 BigQuery 创建总体的每月估算费用。然后,您可以将此估算值与实际费用进行比较,以确定需要优化的方面。
按需
使用按需价格模式时,如需在Google Cloud 价格计算器中估算费用,请按照以下步骤操作:
- 打开Google Cloud 价格计算器。
- 点击添加到估算。
- 选择 BigQuery。
- 在服务类型字段中,选择“按需”。
- 选择将运行查询的位置。
- 对于 Amount of data queried(查询的数据量),输入通过试运行或查询验证器估算的读取字节数。
- 输入 Active storage(活跃存储空间)、Long-term storage(长期存储空间)、Streaming inserts(流式插入)和 Streaming reads(流式读取)的存储空间用量的估算值。 您只需要估算物理存储空间或逻辑存储空间,具体取决于数据集存储结算模式。
- 估算结果会显示在费用详情面板中。如需详细了解估算费用,请点击打开详情视图。您还可以下载和分享费用估算值。
如需了解详情,请参阅按需价格。
版本
将基于容量的价格模式与 BigQuery 版本搭配使用时,如需在Google Cloud 价格计算器中估算费用,请按照以下步骤操作:
- 打开Google Cloud 价格计算器。
- 点击添加到估算。
- 选择 BigQuery。
- 在服务类型字段中,选择“版本”。
- 选择槽的使用位置。
- 选择您的版本。
- 选择槽数上限、基准槽数、可选的承诺和 Estimated utilization of autoscaling(估算的自动扩缩利用率)。
- 选择数据的存储位置。
- 输入 Active storage(活跃存储空间)、Long-term storage(长期存储空间)、Streaming inserts(流式插入)和 Streaming reads(流式读取)的存储空间用量的估算值。 您只需要估算物理存储空间或逻辑存储空间,具体取决于数据集存储结算模式。
- 估算结果会显示在费用详情面板中。如需详细了解估算费用,请点击打开详情视图。您还可以下载和分享费用估算值。
如需了解详情,请参阅基于容量的价格。
使用预留和承诺
最佳实践:使用 BigQuery 预留和承诺来控制费用。
如需了解详情,请参阅限制每种价格模式的费用。
使用槽 Estimator
最佳实践:使用槽 Estimator 估算工作负载所需的槽数。
BigQuery 槽 Estimator 可帮助您根据历史性能指标管理槽容量。
此外,使用按需价格模式的客户在改用基于容量的价格时,可以查看针对性能类似的承诺和自动扩缩预留的容量调整建议。
取消不必要的长时间运行的作业
如需释放容量,请检查长时间运行的作业,确保它们应该继续运行。如果不应该继续运行,请取消它们。
使用信息中心查看费用
最佳实践:创建信息中心来分析 Cloud Billing 数据,以便可以监控和调整 BigQuery 使用量。
您可以导出结算数据到 BigQuery,并在 Looker 数据洞察等工具中直观呈现这些数据。如需查看有关如何创建结算信息中心的教程,请参阅使用 BigQuery 和 Looker Studio 直观呈现 Google Cloud 结算信息。
使用结算预算和提醒
最佳实践:使用 Cloud Billing 预算在一个位置监控 BigQuery 费用。
借助 Cloud Billing 预算,您可以按照计划费用来跟踪实际费用。设置预算金额后,您可以设置预算提醒阈值规则,用于触发电子邮件通知。预算提醒电子邮件有助于您随时了解 BigQuery 支出相对于预算的变化情况。
控制存储费用
可遵循以下最佳实践来优化 BigQuery 存储费用。您还可以优化存储以提升查询性能。
使用长期存储
最佳实践:使用长期存储价格来降低较旧数据的费用。
将数据加载到 BigQuery 存储中后,数据会按照 BigQuery 存储价格计费。对于较旧的数据,您可以自动利用 BigQuery 长期存储价格。
如果您的某个表连续 90 天未曾修改,则该表的存储价格会自动下降 50%。如果您有一个分区表,则每一个分区都会被视为单独的个体来判断是否适用长期存储价格,并遵循与非分区表相同的规则。
配置存储空间结算模式
最佳实践:根据您的使用模式优化存储空间结算模式。
BigQuery 支持按逻辑(未压缩)字节数或物理(已压缩)字节数或者两者的组合来结算存储空间费用。为每个数据集配置的存储空间结算模式决定了您的存储价格,但不会影响查询性能。
您可以使用 INFORMATION_SCHEMA
视图根据您的使用模式确定最合适的存储空间结算模式。
避免覆盖表
最佳实践:使用物理存储空间结算模式时,请避免反复覆盖表。
当您覆盖表时(例如,在批量加载作业中使用 --replace
参数或使用 TRUNCATE TABLE
SQL 语句),系统会在时间旅行和故障安全窗口期间保留被替换的数据。如果您经常覆盖表,则会产生额外的存储空间费用。
您可以改为在加载作业中使用 WRITE_APPEND
参数、使用 MERGE
SQL 语句或使用 Storage Write API,从而以增量方式将数据加载到表中。
缩短时间旅行窗口
最佳实践:根据您的要求,您可以缩短时间旅行窗口。
将时间旅行窗口减少为小于默认值 7 天,可缩短在表中删除或更改的数据的保留期限。只有在使用物理(已压缩)存储空间计费模式时,您才需要为时间旅行存储空间付费。
时间旅行窗口在数据集级层设置。 您还可以使用配置设置为新数据集设置默认时间旅行窗口。
使用目标表的表过期时间
最佳做法:如果要将大量查询结果写入目标表,请使用默认表过期时间移除不再需要的数据。
将大型结果集保留在 BigQuery 存储空间中会产生费用。如果您不需要永久访问这些结果,请使用默认表过期时间来让系统自动为您删除数据。
将数据归档到 Cloud Storage
最佳做法:考虑将数据归档到 Cloud Storage 中。
您可以根据业务对归档的需求将数据从 BigQuery 迁移到 Cloud Storage。最佳实践是在从 BigQuery 导出数据之前考虑长期存储价格和物理存储空间结算模式。
排查 BigQuery 费用差异和意外费用
如需排查 BigQuery 费用意外增加或费用差异问题,请按以下步骤操作:
如需了解 Cloud Billing 报告中 BigQuery 费用的来源,我们首先建议按 SKU 对费用进行分组,以便更轻松地查看相应 BigQuery 服务的使用情况和费用。
之后,请在 SKU 文档页面或 Cloud Billing 界面中的
Pricing
页面中研究相应 SKU 的价格,了解该 SKU 对应的功能,例如 BigQuery Storage Read API、长期存储、按需价格、标准版。确定相应的 SKU 后,使用
INFORMATION_SCHEMA
视图来确定与这些费用相关的特定资源,例如:- 如果您需要为按需分析付费,请查看
INFORMATION_SCHEMA.JOBS
查看示例,以确定导致费用增加的作业以及启动这些作业的用户。 - 如果您因预留或承诺使用合约 SKU 而被收取费用,请查看相应的
INFORMATION_SCHEMA.RESERVATIONS
和INFORMATION_SCHEMA.CAPACITY_COMMITMENTS
视图,以确定被收取费用的预留和承诺使用合约。 - 如果费用来自存储空间 SKU,请查看
INFORMATION_SCHEMA.TABLE_STORAGE
视图示例,了解哪些数据集和表产生了更多费用。
- 如果您需要为按需分析付费,请查看
问题排查的重要注意事项:
请注意,Cloud Billing 报告中的“每日”时间段从美国和加拿大太平洋时间 (UTC-8) 零点开始,并观察美国的夏令时变化。请调整您的计算和数据汇总,以匹配相同的时间范围。
如果结算账号关联了多个项目,并且您想查看特定项目的费用,请按项目进行过滤。
在执行调查时,请务必选择正确的区域。
与查询、预留和承诺相关的意外费用
排查与作业执行相关的意外扣款取决于这些扣款的来源:
- 如果您发现按需分析费用有所增加,这可能与启动的作业数量增加或作业需要处理的数据量发生变化有关。使用
INFORMATION_SCHEMA.JOBS
视图对此进行调查。 - 如果承诺的槽位费用增加,请通过查询
INFORMATION_SCHEMA.CAPACITY_COMMITMENT_CHANGES
来调查是否购买或修改了新的承诺。 - 如需了解因预留使用情况而产生的费用增加,请查看
INFORMATION_SCHEMA.RESERVATION_CHANGES
中记录的预留更改。如需将自动扩缩预留使用情况与结算数据相匹配,请参阅自动扩缩示例。
结算的槽时间大于 INFORMATION_SCHEMA.JOBS 视图计算出的槽时间
使用自动扩缩预留时,结算费用是根据扩缩的槽数计算的,而不是根据使用的槽数计算的。BigQuery 会以 50 个槽为单位自动扩缩,因此即使实际使用的槽数少于自动扩缩的槽数,系统也会按最接近的倍数计费。 自动伸缩器在纵向缩容之前至少需要 1 分钟的时间,这意味着即使查询使用槽的时间不到 1 分钟(例如,只使用了 1 分钟中的 10 秒),系统也会至少收取 1 分钟的费用。“槽自动扩缩”页面中介绍了估算自动扩缩预留费用的正确方法。如需详细了解如何高效使用自动扩缩功能,请参阅自动扩缩最佳实践。
对于非自动扩缩预留,也会出现类似情况,即费用是根据预配的槽数计算的,而不是根据使用的槽数计算的。如果您想估算非自动扩缩预留的费用,可以直接查询 RESERVATIONS_TIMELINE
视图。
结算的字节数小于通过 INFORMATION_SCHEMA.JOBS 为运行按需查询的项目计算出的结算总字节数
实际结算的字节数低于计算出的处理字节数的原因可能有很多:
- 每个项目每月可免费查询 1 TB 的数据,无需支付额外费用。
- 计算中未排除
SCRIPT
类型作业,这可能会导致某些值被重复计算。 - 应用于 Cloud Billing 账号的不同类型的节省,例如协议折扣、促销赠金等。查看 Cloud Billing 报告的“节省”部分。此外,还包括免费层级每月 1 TB 的查询量。
对于运行按需查询的项目,结算费用高于通过 INFORMATION_SCHEMA.JOBS 计算出的处理字节数
如果账单金额大于您通过查询 INFORMATION_SCHEMA.JOBS
视图计算出的值,可能是某些情况导致了这种情况:
针对行级安全表的查询
- 针对具有行级安全性的表的查询不会在
INFORMATION_SCHEMA.JOBS
视图中生成total_bytes_billed
的值,因此,使用INFORMATION_SCHEMA.JOBS
视图中的total_bytes_billed
计算出的结算金额将低于实际结算金额。如需详细了解为何无法看到此信息,请参阅行级安全性最佳实践页面。
- 针对具有行级安全性的表的查询不会在
在 BigQuery 中执行机器学习操作
- BigQuery ML 的按需查询价格取决于所创建模型的类型。与非机器学习查询相比,部分模型操作的费用更高。因此,如果您只是将项目的所有
total_billed_bytes
相加,然后使用标准按需价格(每 TB 的费率),则得出的价格汇总结果并不正确,您需要考虑每 TB 的价格差异。
- BigQuery ML 的按需查询价格取决于所创建模型的类型。与非机器学习查询相比,部分模型操作的费用更高。因此,如果您只是将项目的所有
价格金额不正确
- 确认计算中使用了正确的每 TB 价格值 - 请务必选择正确的区域,因为价格取决于地理位置。请参阅价格文档。
一般建议是按照公开文档中推荐的方式计算按需作业的结算用量。
即使 BigQuery Reservations API 已停用,且未使用任何预留或承诺,仍会因使用该 API 而产生费用
检查 SKU,以便更好地了解哪些服务需要付费。如果结算的 SKU 为 BigQuery Governance SKU
,则表示这些费用来自 Dataplex Universal Catalog。
某些 Dataplex Universal Catalog 功能使用 BigQuery 触发作业执行。这些费用现在会根据相应的 BigQuery Reservations API SKU 进行处理。如需了解详情,请参阅 Dataplex Universal Catalog 价格文档。
项目已分配给预留,但仍会产生 BigQuery 分析按需费用
请仔细阅读排查预留问题部分,确定Analysis
费用可能来自何处。
BigQuery Standard 版的按需付费 (PAYG) 槽的意外费用
在 Cloud Billing 报告中,应用标签为 goog-bq-feature-type
且值为 BQ_STUDIO_NOTEBOOK
的过滤条件。您看到的用量是 BigQuery 标准版中的按需付费槽,这些费用是使用 BigQuery Studio 笔记本产生的。详细了解 BigQuery Studio 笔记本价格。
停用 Reservations API 后显示的 BigQuery Reservations API 费用
停用 BigQuery 不会停止收取承诺费用。如需停止支付承诺费用,您需要删除承诺。将续订方案设置为 NONE
,承诺到期后会自动删除。
意外的存储费用
可能导致存储费用增加的情况:
- 表中存储的数据量增加 - 使用
INFORMATION_SCHEMA.TABLE_STORAGE_USAGE_TIMELINE
视图监控表的字节数变化 - 更改数据集结算模式
- 增加采用物理计费模型的数据集的时间旅行窗口
- 修改包含长期存储数据的表,导致这些表变为活跃存储
删除表或数据集导致 BigQuery 存储费用增加
BigQuery 时间旅行功能会将已删除的数据保留一段时间,该时间长度为配置的时间旅行窗口时长,外加 7 天的故障安全恢复期。在此保留期限内,即使表不再显示在 INFORMATION_SCHEMA.TABLE_STORAGE
或控制台中,物理存储结算模式数据集中的已删除数据仍会产生活跃物理存储费用。如果表数据位于长期存储中,删除操作会导致相应数据移至活跃物理存储。这会导致相应费用上涨,因为根据 BigQuery 存储空间价格页面,活跃物理字节的费用大约是长期物理字节的 2 倍。对于采用物理存储结算模式的数据集,建议将时间旅行窗口缩短为 2 天,以尽量减少因删除数据而产生的费用。
在不修改数据的情况下降低存储费用
在 BigQuery 中,用户需要为活跃存储空间和长期存储空间付费。活跃存储费用包括连续 90 天未发生修改的任何表或表分区,而长期存储费用包括连续 90 天未发生修改的表和分区。当数据转换为长期存储时,存储总费用会降低,因为长期存储的费用比活跃存储低约 50%。如需了解详情,请参阅存储价格。
INFORMATION_SCHEMA 存储空间计算结果与结算信息不一致
- 使用
INFORMATION_SCHEMA.TABLE_STORAGE_USAGE_TIMELINE
视图而不是INFORMATION_SCHEMA.TABLE_STORAGE
-TABLE_STORAGE_USAGE_TIMELINE
可提供更准确、更精细的数据,以便正确计算存储费用 - 在
INFORMATION_SCHEMA
视图中运行的查询不包含税费、调整项和舍入误差,因此在比较数据时请考虑这些因素。如需详细了解 Cloud Billing 中的报告,请参阅本页面。 INFORMATION_SCHEMA
视图中显示的数据采用的是世界协调时间 (UTC),而结算报告数据采用的是美国和加拿大太平洋时间 (UTC-8)。
后续步骤
- 了解 BigQuery 定价。
- 了解如何优化查询。
- 了解如何优化存储。
如需了解结算、提醒和直观显示数据,请参阅以下主题: