totalBytesBilled与totalBytesProcessed不同

N.N*_*.N. 5 google-bigquery

我正在使用条纹BigQuery开发人员工具,并注意到"查询成本"中的一些奇怪的行为.在深入挖掘细节时,我在totalBytesBilled和totalBytesProcessed属性中发现了一个奇怪的行为.但我理解它有点麻烦......

从BigQuery资源:

  • statistics.query.totalBytesBilled:为作业计费的总字节数.
  • statistics.query.totalBytesProcessed:为作业处理的总字节数.

这两个属性的描述非常模糊......

根据我过去的经验,我预计在消耗配额的免费部分后,这两个是相同的.

样本数据集的示例查询

SELECT word,    word_count 
FROM [publicdata:samples.shakespeare] S
LIMIT 1000
Run Code Online (Sandbox Code Playgroud)

回:

   "totalBytesProcessed": "2650191",
   "totalBytesBilled": "10485760",
Run Code Online (Sandbox Code Playgroud)
  1. 有人可以更好地解释这些属性是什么,它们之间有什么区别?
  2. 为什么一些(非常小的)查询我得到的totalBytesBilled明显高于totalBytesProcessed?
  3. 他们是如何计算的?
  4. 有关优化查询以最小化"totalBytesBilled"的任何提示
  5. https://cloud.google.com/bigquery/pricing#on_demand中,它说:"高计算层适用于相对于扫描的字节数消耗非常大的计算资源的查询.例如,包含非常大数量的查询JOIN或CROSS JOIN子句,或具有大处理要求的复杂用户定义函数(UDF)." 你能更具体一点吗?有多少是"非常多的加入条款"?什么使UDF"复杂"?

谢谢

Jer*_*dit 7

查询定价在此处完整记录:https: //cloud.google.com/bigquery/pricing#on_demand

为您的问题提供具体答案:

  1. totalBytesProcessed字段告诉您查询处理(读取)了多少数据.该totalBytesBilled字段告诉您实际需要支付多少字节.这些通常是相同的,但在某些极端情况(见下文)或运行"高计算"查询时可能会有所不同(请参阅上面的链接).

  2. 每个查询最少10 MB,每个表最少10 MB,以计算开销.这些最小值(如上所述)是您注意到的差异的原因.这些费用之前已在您的帐单生成时应用,但以前未通过此API报告.通过添加totalBytesBilled字段,我们现在可以向您显示这些额外的结算明细.(请注意,这里涉及的实际金额非常小:5美元/ TB,10 MB是0.000005美元.如果您在最低10 MB的情况下运行100,000次查询的每日限制,那么您只需支付5美元.)

  3. 此处记录数据大小计算,上面的链接说明了此数据大小计算如何转换为每个查询的价格.

  4. 一般来说,只参考您关心的数据.考虑使用表通配符函数表装饰器来限制查询扫描的数据范围.请注意,LIMIT操作员限制结果的大小,但限制扫描/计费的数据量!

  5. 我们不能给出具体的数字,因为有很多变量会影响查询的计算密集程度.连接(特别是交叉连接)可能很昂贵,因为它们可以乘以查询处理的数据量,然后消耗的资源比我们为查询预算的资源多.UDF可能很昂贵,因为它们可以为每一行执行大型计算(嵌套循环,复杂控制流).但是,少数输入与输入大小成比例的连接,或者执行与输入数据大小成比例的适度计算的UDF,仍应属于第1层.

    考虑这种变化的一种方法是,我们根据计算资源的数量预算,我们可以在给定的查询中投入totalBytesProcessed.UDF等新功能使查询更容易超出预算,我们希望为用户提供支付高计算查询的方式,而不仅仅是导致查询失败.

    如果您想计划此更改,可以观察totalBytesBilled和更改billingTier字段以查看哪些查询需要在更高层运行.如果您选择在更高层运行查询,请参阅此处以获取有关如何选择基于每个查询或每个项目的详细信息.