totalBytesBilled 不同于 totalBytesProcessed

totalBytesBilled is different from totalBytesProcessed

我正在使用 streak BigQuery 开发人员工具并注意到 "Query Cost" 中的一些奇怪行为。在深入研究细节时,我在 totalBytesBilled 和 totalBytesProcessed 属性中发现了一个奇怪的行为。 但我在理解它时遇到了一些困难...

来自 BigQuery 资源:

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

根据我过去的经验,我预计这两个在我用完配额的免费部分后会是一样的。

示例数据集的示例查询

SELECT word,    word_count 
FROM [publicdata:samples.shakespeare] S
LIMIT 1000

返回:

   "totalBytesProcessed": "2650191",
   "totalBytesBilled": "10485760",
  1. 有人可以更好地解释这些属性是什么以及它们之间有什么区别吗?
  2. 为什么对于某些(非常小的)查询,我得到的 totalBytesBilled 明显高于 totalBytesProcessed?
  3. 它们是如何计算的?
  4. 优化我的查询以最小化的任何提示 "totalBytesBilled"
  5. https://cloud.google.com/bigquery/pricing#on_demand 它说:“高计算层适用于消耗的查询 相对于数量而言非常大的计算资源 字节扫描。例如,包含 非常大的查询 JOIN 或 CROSS JOIN 子句的数量,或 复杂的用户定义 具有大量处理要求的函数 (UDF)。” 你能更具体一点吗? "very large number of join clauses" 是多少?是什么构成了 UDF "complex"?

谢谢

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

具体回答您的问题:

  1. totalBytesProcessed 字段告诉您查询处理(读取)了多少数据。 totalBytesBilled 字段告诉您实际为多少字节付费。这些通常是相同的,但在某些极端情况下(见下文)或当您 运行 一个 "high compute" 查询(见上文 link)时可能会有所不同。

  2. 每个查询最少 10 MB,每个 table 引用最少 10 MB,以计算开销。这些最小值(上面记录的)是您注意到的差异的原因。这些费用以前是在您生成帐单时收取的,但以前没有通过此 API 报告。通过添加 totalBytesBilled 字段,我们现在可以向您显示这些额外的账单明细。 (请注意,此处涉及的实际金额非常小:5 美元/TB,10 MB 是 0.000005 美元。如果您 运行 在 10 MB 的最低限度下每天查询 100,000 次,您只需支付 5 美元。)

  3. 记录了数据大小计算 here,上面的 link 解释了此数据大小计算 t运行 如何计算每个查询的价格。

  4. 一般来说,只参考您关心的数据。考虑使用 table wildcard functions or table decorators 来限制查询扫描的数据的 运行ge。请注意,LIMIT 运算符限制了结果的大小,但 而不是 数据量 scanned/billed!

  5. 我们无法给出具体数字,因为有很多变量会影响查询的计算密集程度。连接(尤其是交叉连接)可能很昂贵,因为它们会成倍增加查询处理的数据量,从而消耗比我们为查询预算的更多资源。 UDF 可能很昂贵,因为它们可以为每一行执行大量计算(嵌套循环、复杂的控制流)。但是,输出与输入大小成正比的少数联接,或执行与输入数据大小成正比的适度计算的 UDF 仍应属于第 1 层。

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

    如果您想为此更改做好计划,您可以观察 totalBytesBilledbillingTier 字段以了解您的哪些查询需要 运行等级。如果您选择 运行 更高层级的查询,请参阅 here 了解有关如何在每个查询或每个项目的基础上选择加入的详细信息。

据我了解 - 公式是

SELECT MAX(cost) as totalBytesBilled FROM 
(SELECT 10485760 as cost) as min_billed_10MB_bytes, 
(SELECT INTEGER(1024*1024*CEIL(totalBytesProcessed/1024/1024)) as cost) as processed_rounded_up_to_MB_bytes