【问题标题】:BigQuery: can I lower querying costs by storing data in multiple tables?BigQuery:我可以通过将数据存储在多个表中来降低查询成本吗?
【发布时间】: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。虽然我怀疑这是真的,但我想确认一下。

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

谢谢!

【问题讨论】:

    标签: google-bigquery


    【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-14
          • 2013-10-29
          相关资源
          最近更新 更多