totalBytesBilled 不同于 totalBytesProcessed
totalBytesBilled is different from totalBytesProcessed
我正在使用 streak BigQuery 开发人员工具并注意到 "Query Cost" 中的一些奇怪行为。在深入研究细节时,我在 totalBytesBilled 和 totalBytesProcessed 属性中发现了一个奇怪的行为。
但我在理解它时遇到了一些困难...
来自 BigQuery 资源:
- statistics.query.totalBytesBilled:为作业计费的总字节数。
- statistics.query.totalBytesProcessed :处理的总字节数
工作。
这 2 个属性的描述非常模糊...
根据我过去的经验,我预计这两个在我用完配额的免费部分后会是一样的。
示例数据集的示例查询
SELECT word, word_count
FROM [publicdata:samples.shakespeare] S
LIMIT 1000
返回:
"totalBytesProcessed": "2650191",
"totalBytesBilled": "10485760",
- 有人可以更好地解释这些属性是什么以及它们之间有什么区别吗?
- 为什么对于某些(非常小的)查询,我得到的 totalBytesBilled 明显高于 totalBytesProcessed?
- 它们是如何计算的?
- 优化我的查询以最小化的任何提示 "totalBytesBilled"
- 在 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
具体回答您的问题:
totalBytesProcessed
字段告诉您查询处理(读取)了多少数据。 totalBytesBilled
字段告诉您实际为多少字节付费。这些通常是相同的,但在某些极端情况下(见下文)或当您 运行 一个 "high compute" 查询(见上文 link)时可能会有所不同。
每个查询最少 10 MB,每个 table 引用最少 10 MB,以计算开销。这些最小值(上面记录的)是您注意到的差异的原因。这些费用以前是在您生成帐单时收取的,但以前没有通过此 API 报告。通过添加 totalBytesBilled
字段,我们现在可以向您显示这些额外的账单明细。 (请注意,此处涉及的实际金额非常小:5 美元/TB,10 MB 是 0.000005 美元。如果您 运行 在 10 MB 的最低限度下每天查询 100,000 次,您只需支付 5 美元。)
记录了数据大小计算 here,上面的 link 解释了此数据大小计算 t运行 如何计算每个查询的价格。
一般来说,只参考您关心的数据。考虑使用 table wildcard functions or table decorators 来限制查询扫描的数据的 运行ge。请注意,LIMIT
运算符限制了结果的大小,但 而不是 数据量 scanned/billed!
我们无法给出具体数字,因为有很多变量会影响查询的计算密集程度。连接(尤其是交叉连接)可能很昂贵,因为它们会成倍增加查询处理的数据量,从而消耗比我们为查询预算的更多资源。 UDF 可能很昂贵,因为它们可以为每一行执行大量计算(嵌套循环、复杂的控制流)。但是,输出与输入大小成正比的少数联接,或执行与输入数据大小成正比的适度计算的 UDF 仍应属于第 1 层。
考虑此更改的一种方法是,我们根据 totalBytesProcessed
对可以在给定查询中投入的计算资源量进行预算。 UDF 等新功能使查询更容易超出预算,我们希望为用户提供一种为高计算查询付费的方式,而不仅仅是导致他们的查询失败。
如果您想为此更改做好计划,您可以观察 totalBytesBilled
和 billingTier
字段以了解您的哪些查询需要 运行等级。如果您选择 运行 更高层级的查询,请参阅 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
我正在使用 streak BigQuery 开发人员工具并注意到 "Query Cost" 中的一些奇怪行为。在深入研究细节时,我在 totalBytesBilled 和 totalBytesProcessed 属性中发现了一个奇怪的行为。 但我在理解它时遇到了一些困难...
来自 BigQuery 资源:
- statistics.query.totalBytesBilled:为作业计费的总字节数。
- statistics.query.totalBytesProcessed :处理的总字节数 工作。
这 2 个属性的描述非常模糊...
根据我过去的经验,我预计这两个在我用完配额的免费部分后会是一样的。
示例数据集的示例查询
SELECT word, word_count
FROM [publicdata:samples.shakespeare] S
LIMIT 1000
返回:
"totalBytesProcessed": "2650191",
"totalBytesBilled": "10485760",
- 有人可以更好地解释这些属性是什么以及它们之间有什么区别吗?
- 为什么对于某些(非常小的)查询,我得到的 totalBytesBilled 明显高于 totalBytesProcessed?
- 它们是如何计算的?
- 优化我的查询以最小化的任何提示 "totalBytesBilled"
- 在 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
具体回答您的问题:
totalBytesProcessed
字段告诉您查询处理(读取)了多少数据。totalBytesBilled
字段告诉您实际为多少字节付费。这些通常是相同的,但在某些极端情况下(见下文)或当您 运行 一个 "high compute" 查询(见上文 link)时可能会有所不同。每个查询最少 10 MB,每个 table 引用最少 10 MB,以计算开销。这些最小值(上面记录的)是您注意到的差异的原因。这些费用以前是在您生成帐单时收取的,但以前没有通过此 API 报告。通过添加
totalBytesBilled
字段,我们现在可以向您显示这些额外的账单明细。 (请注意,此处涉及的实际金额非常小:5 美元/TB,10 MB 是 0.000005 美元。如果您 运行 在 10 MB 的最低限度下每天查询 100,000 次,您只需支付 5 美元。)记录了数据大小计算 here,上面的 link 解释了此数据大小计算 t运行 如何计算每个查询的价格。
一般来说,只参考您关心的数据。考虑使用 table wildcard functions or table decorators 来限制查询扫描的数据的 运行ge。请注意,
LIMIT
运算符限制了结果的大小,但 而不是 数据量 scanned/billed!我们无法给出具体数字,因为有很多变量会影响查询的计算密集程度。连接(尤其是交叉连接)可能很昂贵,因为它们会成倍增加查询处理的数据量,从而消耗比我们为查询预算的更多资源。 UDF 可能很昂贵,因为它们可以为每一行执行大量计算(嵌套循环、复杂的控制流)。但是,输出与输入大小成正比的少数联接,或执行与输入数据大小成正比的适度计算的 UDF 仍应属于第 1 层。
考虑此更改的一种方法是,我们根据
totalBytesProcessed
对可以在给定查询中投入的计算资源量进行预算。 UDF 等新功能使查询更容易超出预算,我们希望为用户提供一种为高计算查询付费的方式,而不仅仅是导致他们的查询失败。如果您想为此更改做好计划,您可以观察
totalBytesBilled
和billingTier
字段以了解您的哪些查询需要 运行等级。如果您选择 运行 更高层级的查询,请参阅 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