仅选择几行时 bigquery 会多收费

Posted

技术标签:

【中文标题】仅选择几行时 bigquery 会多收费【英文标题】:bigquery overcharges when selecting just few rows 【发布时间】:2014-06-01 08:32:54 【问题描述】:

从 logs.nobids_05 限制 1 中选择 DATE(request_time) 给了我“3.48 GB 已处理”,考虑到 request_time 是一个出现在每一行中的字段,这有点多。

在许多其他情况下,只需触摸列就会自动将其总大小添加到成本中。例如,

select * from logs.nobids_05 limit 1

给我“这个查询在运行时将处理 274 GB”。 我确信 bigquery 不需要读取 274GB 即可输出 1 行数据。

【问题讨论】:

这个问题是关于技术问题,并讨论了Google bigquery的收费算法中可能存在的错误。我正在将此情况通知 bigquery 团队。非常感谢! 【参考方案1】:

2019 年更新:如果您对表进行集群,SELECT * LIMIT 1 的成本将是最低的。

https://medium.com/google-cloud/bigquery-optimized-cluster-your-tables-65e2f684594b

使用 BigQuery 运行“SELECT * FROM big_table LIMIT 1”相当于执行此操作:https://www.youtube.com/watch?v=KZ-slvv_ZT4。

BigQuery 是一个分析型数据库。它的架构和定价针对大规模分析进行了优化,而不是针对单行处理。

BigQuery 中的每个操作都涉及全表扫描,但仅限于查询中提到的列。目标是具有可预测的成本:在运行查询之前,您能够知道将涉及多少数据,从而知道它的成本。只查询一行似乎是一个很大的代价,但好消息是成本保持不变,即使查询变得更加复杂和 CPU 密集型。

有时您可能需要运行单行查询,而且成本似乎过高,但这里的假设是您正在使用此工具来大规模分析数据,以及将数据存储在它应该比其他可用工具更具竞争力。由于您一直在使用其他工具,因此我希望看到真实案例场景中分析会话的总成本比较。

顺便说一句,BigQuery 有一种更好的方法来执行相当于“SELECT * LIMIT x”的操作。它是免费的,它依赖于 REST API 而不是查询:

https://developers.google.com/bigquery/docs/reference/v2/tabledata/list

话虽如此,感谢您的反馈,因为在使定价更复杂和工具更适合其他工作之间存在平衡工作 - 这种平衡建立在我们获得的反馈之上。

【讨论】:

我明白你在说什么。不幸的是,在实际情况下,操作员希望在编写更复杂的猜测之前查看一些数据。这个过程是迭代的:我编写了一个简单的“select .. from .. where ..limit k”查询,检查结果,根据我看到的内容编写更复杂的查询等......例如,考虑使用 bigquery 特定功能与层次结构相关 - 我永远不会记住所有这些,我需要先尝试一下......无论如何,我从你那里了解到它正在按预期工作,所以我要结束这个问题。 是的!在尝试查询时处理较小的数据集是完全有意义的。在 BigQuery 上执行此操作的最佳方法是从大数据集中提取一个小样本到一个新表中,然后对其进行处理 - 然后在实际运行时更改查询表的名称。作为一个真实的例子,这正是 Shine Tech 在处理多个 TB 长表时所做的事情:youtube.com/watch?v=LSLU8Gxt-rc。 我使用表装饰器来查询数据集的小样本,并且只为它们收费。虽然它只涵盖新数据... 我喜欢“免费”部分:它是否记录在任何地方,它是免费的吗?这就是cloud.google.com/bigquery/pricing 中“元数据操作”下的“列表”的含义吗? (由于这是获取真实的行,我认为这是“真实的”数据,不是元数据,而是 w/e。)【参考方案2】:

我不认为这是一个错误。 “当您运行查询时,即使您对结果设置了明确的 LIMIT,也会根据您选择的列中处理的总数据向您收费。” (https://developers.google.com/bigquery/pricing#samplecosts)

【讨论】:

以上是关于仅选择几行时 bigquery 会多收费的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 在选择不同行时按一个字段中的最大值分组

Big Query 或 SQL 重塑数据

BigQuery 隐藏 UDF 实现

BigQuery:无效日期错误

仅在选择返回有效行时,仅插入到表中

BigQuery - 在插入表时调用查询