Bigquery 分区 table 性能
Bigquery partitioning table performance
我对各种场景下的 BQ 性能有疑问,尤其是围绕并行化 "under the hood"。
我每天保存 100M 条记录。目前,我每 5 天轮换 table 秒,以避免因全面 table 扫描而产生高额费用。
如果我要 运行 日期范围为 "last 30 days" 的查询(例如),我将扫描 6(如果我在分区的最后一天)和7 table 秒。
作为替代方案,我可以每天将我的数据划分为一个新的 table。在这种情况下,我将优化我的开支——因为我从来没有查询过比我拥有的更多的数据。问题是,在将结果返回给客户端方面会受到性能损失,因为我现在可能并行查询 30 或 90 或 365 tables(联合)。
总结一下:
- 更多 tables = 扫描的数据更少
- 更少 tables =(?) 更长的客户端响应时间
谁能阐明如何在成本和性能之间找到平衡点?
很大程度上取决于您编写查询的方式和开发成本,但数据量不会像障碍一样缝合,因此您尝试过早进行优化。
当您 JOIN table 大于 8MB 时,您需要使用 EACH 修饰符,并且该查询是内部并行的。
此分区意味着您可以获得更高的有效读取带宽,因为您可以并行读取许多此类磁盘。 Dremel 利用了这一点;当您 运行 一个查询时,它可以一次从数千个磁盘中读取您的数据。
在内部,BigQuery 将 table 存储在
碎片;这些是可以并行处理的离散数据块。如果
你有一个 100 GB table,它可能存储在 5000 个分片中,这允许它
由多达 5000 名工人并行处理。你不应该做任何假设
关于 table 中分片数量的大小。 BigQuery 将重新分区
定期数据以优化存储和查询行为。
继续为每天创建 tables,一个建议是编写您的 create/patch 脚本,以便在 运行 的将来创建 tables ]s 例如:我现在每天都创建 tables 的下一个 12 个月。这比每天创建 table 的脚本要好。并使其成为您的 deploy/provisioning 脚本的一部分。
要阅读更多内容,请参阅本书 Chapter 11 ■ Managing Data Stored in BigQuery。
我对各种场景下的 BQ 性能有疑问,尤其是围绕并行化 "under the hood"。
我每天保存 100M 条记录。目前,我每 5 天轮换 table 秒,以避免因全面 table 扫描而产生高额费用。
如果我要 运行 日期范围为 "last 30 days" 的查询(例如),我将扫描 6(如果我在分区的最后一天)和7 table 秒。
作为替代方案,我可以每天将我的数据划分为一个新的 table。在这种情况下,我将优化我的开支——因为我从来没有查询过比我拥有的更多的数据。问题是,在将结果返回给客户端方面会受到性能损失,因为我现在可能并行查询 30 或 90 或 365 tables(联合)。
总结一下:
- 更多 tables = 扫描的数据更少
- 更少 tables =(?) 更长的客户端响应时间
谁能阐明如何在成本和性能之间找到平衡点?
很大程度上取决于您编写查询的方式和开发成本,但数据量不会像障碍一样缝合,因此您尝试过早进行优化。
当您 JOIN table 大于 8MB 时,您需要使用 EACH 修饰符,并且该查询是内部并行的。
此分区意味着您可以获得更高的有效读取带宽,因为您可以并行读取许多此类磁盘。 Dremel 利用了这一点;当您 运行 一个查询时,它可以一次从数千个磁盘中读取您的数据。
在内部,BigQuery 将 table 存储在 碎片;这些是可以并行处理的离散数据块。如果 你有一个 100 GB table,它可能存储在 5000 个分片中,这允许它 由多达 5000 名工人并行处理。你不应该做任何假设 关于 table 中分片数量的大小。 BigQuery 将重新分区 定期数据以优化存储和查询行为。
继续为每天创建 tables,一个建议是编写您的 create/patch 脚本,以便在 运行 的将来创建 tables ]s 例如:我现在每天都创建 tables 的下一个 12 个月。这比每天创建 table 的脚本要好。并使其成为您的 deploy/provisioning 脚本的一部分。
要阅读更多内容,请参阅本书 Chapter 11 ■ Managing Data Stored in BigQuery。