BigQuery:我可以通过将数据存储在多个表中来降低查询成本吗?

Posted

技术标签:

【中文标题】BigQuery:我可以通过将数据存储在多个表中来降低查询成本吗?【英文标题】:BigQuery: can I lower querying costs by storing data in multiple tables? 【发布时间】:2017-06-04 16:55:28 【问题描述】:

我有一个表,目前 BigQuery 中有超过 4300 万行用于存储数据样本。其中一个字段是“owner_id”。我的所有查询都是针对单个所有者完成的。

例子:

SELECT COUNT(*)
FROM `mydataset.mytable` 
WHERE owner_id = "owner23" AND color = "red"

为每个所有者创建一个表会降低我的 BigQuery 查询成本吗?我怀疑使用 WHERE owner_id = "owner23" AND color = "red" 查询整个表比使用仅使用 owner23 的数据和使用 WHERE color = "red" 查询表需要处理更多 GB。虽然我怀疑这是真的,但我想确认一下。

另外,将我的数据拆分到多个表会导致存储成本增加吗?

谢谢!

【问题讨论】:

【参考方案1】:

为每个所有者创建一个表会降低我的 BigQuery 查询成本吗?

理论上 - 是的。您只需为查询的列中的数据付费——无论每个 WHERE 子句有多少行是合格的。例如,如果您有 10 个具有相对均匀数据的客户端 - 您的查询成本可以降低多达 10 倍 - 或者在只有 COUNT(1) 而没有其他 WHERE 子句的情况下 - 它将是 0 美元(零!) 有一个小问题,如果查询成本不为零——最低费用为 10MB——因此,如果您的拆分表小且所涉及的列的大小小于 10MB——您仍将按 10MB 收费

实际上 - 管理多个表的潜在“成本”可能很高,因此您需要自行比较和决定

将我的数据拆分到多个表会导致存储成本增加吗?

存储定价按每 MB、每秒按比例分配 - 所以不 - 存储成本不会增加

【讨论】:

【参考方案2】:

BigQuery 将过滤器下推到表存储中,尤其是对于诸如此类的简单查询。您可以阅读有关过滤器下推here 的信息。请注意,从这个角度来看,标准 SQL 具有更强大的优化器。

所以,我不认为你会得到很多好处。但是,您可能想测试一下它是否有效。我真诚地怀疑,管理单独表的额外复杂性是否值得这样做。

【讨论】:

【参考方案3】:

您的存储成本不会受到影响,因为存储的整体数据是相同的。会有额外的表元数据,但这不会影响您的存储成本。由于扫描查询的数据减少了 10 倍,因此查询成本将降低。

话虽如此,但这不是实现大查询用例的推荐方法。 BQ 明确建议避免创建共享表,请考虑这个日期分片示例 - https://cloud.google.com/bigquery/docs/best-practices-performance-communication#avoid_tables_sharded_by_date

您应该考虑的是clustering 您的桌子Owner_id。它具有以下优点

与 owner_id 分片表完全相同的计算节省 (analysis pricing) 没有额外的表元数据或访问控制开销,您不需要为所有分片表维护 ACL!! 降低提取时间复杂度,即即使创建了新所有者,集群也会处理它,而如果您选择为每个所有者创建单独的表,则需要处理新表的创建

集群也是免费的,只有一个缺点是加载时间开销并不重要。请参阅这篇旧帖子,它会引导您了解集群基础知识 - https://hoffa.medium.com/bigquery-optimized-cluster-your-tables-65e2f684594b

【讨论】:

以上是关于BigQuery:我可以通过将数据存储在多个表中来降低查询成本吗?的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery:数据集中的大量表会影响性能吗?

使用存储过程的 bigquery 中的多个删除操作

如何知道我的表中都有哪些属于 bigQuery 的长期存储?

如何使用 dplyr 和 bigquery 从 Bigquery 数据集中的多个表中进行选择?

多个 Big Query 表或类似数据的单数表

将CSV加载到BigQuery表中的问题