何时在 BigQuery 中使用分区
When to use partitioning in BigQuery
我希望利用您在 BigQuery 方面的经验来决定我的数据的最佳结构,
我在关系数据库尤其是Oracle DB方面有5年的经验,我熟悉在关系数据库中构建数据仓库的最佳实践,但在云解决方案方面,我还是新手
我的问题是关于 BigQuery 中的分区 table,
据我所知,我们在 BigQuery 中只有一天的分区,
所以我的很多数据每天的行数很少(最多 1K 到 12K),但它们包含很长一段时间的数据,所以对 [=18 进行分区是个好主意=] 以当天为准?
如果我每年将数据划分为 tables,并创建一个视图来表示所有 tables,这会有帮助吗?或者 BigQuery 上是否有任何其他解决方案。
根据您的经验,当在 BQ 中使用分区是有效的时,每天的数据应该有多大?
如果您有任何关于使用 BQ 进行 DWH 的最佳实践的参考资料或书籍,请提供给我。
so a lot of my data have low count of rows on daily basis (between 1K to 12K max) , but they contains data for a long period of time, so is it a good idea to partition the table based on the day?
这取决于您要使用的查询涵盖的时间范围。
案例A.
例如,如果您的查询的最长持续时间为 1 周,那么在速度和成本方面划分为每日分区可能非常有益,因为引擎不需要扫描整个 table。它只会 select 7 个每日分区。
示例:对于 public 数据集 bigquery-public-data.samples.github_timeline
,一个涵盖 1 天的查询导致数据使用量约为数百兆字节,原因是table扫描。使用类似的每日分区 table 可将 1 天查询产生的数据使用量减少到 ~10 MB。
案例 B.
另一方面,如果最频繁的 运行 查询涵盖了一年或两年的时间范围(例如,table 中的整个数据跨度),那么每日分区并没有多大帮助,引擎无论如何都需要处理几乎所有的 table。因此,每天进行分区无济于事。如果每日数据量小于最小集群大小,集群会对数据使用产生不利影响,因为引擎最终将处理更多磁盘 space。
如果记录了类似的注意事项以及实际最小集群大小和最小分区大小(如果有)的信息,将会很有帮助。如果这些数字是动态的,那么预期范围是多少。
有用的答案:
您在 Bigquery 中有两种分区模式
- 按日期分区
- 按整数范围划分
两者都可以容纳 4000 个分区,因此请明智地选择选项。
如果您的日期范围大于或预计大于 4000 天,您可能需要按 week/month.
进行分区
对于整数范围,可以使用 unixtime 作为整数,范围跨越 10 年以上,每个范围大于 24 小时。这是数学。
为分区 table 选择特定的列命名约定,例如:partitioned
,或 timestamp
。
ps。您可以应用其他 4 个列来进一步聚类 table。
一个实际的例子是:
- 按时间戳分区,按国家/地区聚类
- 按每周时间戳分区,按天列聚类
- 按整数范围列分区,例如:unix 时间,按事件、类别、语言聚类
我希望利用您在 BigQuery 方面的经验来决定我的数据的最佳结构, 我在关系数据库尤其是Oracle DB方面有5年的经验,我熟悉在关系数据库中构建数据仓库的最佳实践,但在云解决方案方面,我还是新手
我的问题是关于 BigQuery 中的分区 table, 据我所知,我们在 BigQuery 中只有一天的分区,
所以我的很多数据每天的行数很少(最多 1K 到 12K),但它们包含很长一段时间的数据,所以对 [=18 进行分区是个好主意=] 以当天为准? 如果我每年将数据划分为 tables,并创建一个视图来表示所有 tables,这会有帮助吗?或者 BigQuery 上是否有任何其他解决方案。 根据您的经验,当在 BQ 中使用分区是有效的时,每天的数据应该有多大?
如果您有任何关于使用 BQ 进行 DWH 的最佳实践的参考资料或书籍,请提供给我。
so a lot of my data have low count of rows on daily basis (between 1K to 12K max) , but they contains data for a long period of time, so is it a good idea to partition the table based on the day?
这取决于您要使用的查询涵盖的时间范围。
案例A.
例如,如果您的查询的最长持续时间为 1 周,那么在速度和成本方面划分为每日分区可能非常有益,因为引擎不需要扫描整个 table。它只会 select 7 个每日分区。
示例:对于 public 数据集 bigquery-public-data.samples.github_timeline
,一个涵盖 1 天的查询导致数据使用量约为数百兆字节,原因是table扫描。使用类似的每日分区 table 可将 1 天查询产生的数据使用量减少到 ~10 MB。
案例 B.
另一方面,如果最频繁的 运行 查询涵盖了一年或两年的时间范围(例如,table 中的整个数据跨度),那么每日分区并没有多大帮助,引擎无论如何都需要处理几乎所有的 table。因此,每天进行分区无济于事。如果每日数据量小于最小集群大小,集群会对数据使用产生不利影响,因为引擎最终将处理更多磁盘 space。
如果记录了类似的注意事项以及实际最小集群大小和最小分区大小(如果有)的信息,将会很有帮助。如果这些数字是动态的,那么预期范围是多少。
有用的答案:
您在 Bigquery 中有两种分区模式
- 按日期分区
- 按整数范围划分
两者都可以容纳 4000 个分区,因此请明智地选择选项。
如果您的日期范围大于或预计大于 4000 天,您可能需要按 week/month.
进行分区
对于整数范围,可以使用 unixtime 作为整数,范围跨越 10 年以上,每个范围大于 24 小时。这是数学。
为分区 table 选择特定的列命名约定,例如:partitioned
,或 timestamp
。
ps。您可以应用其他 4 个列来进一步聚类 table。
一个实际的例子是:
- 按时间戳分区,按国家/地区聚类
- 按每周时间戳分区,按天列聚类
- 按整数范围列分区,例如:unix 时间,按事件、类别、语言聚类