BQ 分区表&聚簇表


分区表

分区表实际就是将一张大表,基于例如,提取时间、时间戳、整数范围等,拆分为多个小表,以达到更高效管理&查询数据的目的。

举例来说,如果我对为分区的一个大表,根据 gen_data 这个字段筛选 == '2020-08-14' 的数据,未分区的表,需要完全读取这个字段数据,查询数据 1TB。

而如果对 gen_data 这个字段建立了分区,那就能极大缩小查询范围,查询数据可能就是几十mb,数据差异会巨大。

注:这块根据提取时间构建的分区表,提取时间分区表包含名为 _PARTITIONTIME 的伪列,该列包含基于日期的数据加载时间戳,也就是说,之前的表结构中是没有这个字段的,这个字段是 BQ 根据数据加载时间自动划分的。

聚簇表

聚簇可以提高某些类型的查询(例如,使用过滤条件子句的查询和聚合数据的查询)的性能。当通过查询作业或加载作业将数据写入聚簇表时,BigQuery 会使用聚簇列中的值对这些数据进行排序。这些值用于将数据整理到 BigQuery 存储的多个块中。当您提交的查询包含基于聚簇列过滤数据的子句时,BigQuery 会使用已排序的块来避免扫描不必要的数据。 如果表或分区低于 1 GB,则聚簇表和未聚簇表之间的查询性能可能不会有显著差异。

BigQuery 支持对分区表和非分区表进行聚簇。

相似&相异点

相似

  1. 都是通过增加插入数据&存储空间上的消耗,来提高查询时效率。
  2. 都是当数据规模较大时,才有明显的效率提升(至少 > 1GB)

相异

  1. 聚簇并没有对数据进行实际的划分,只是插入时就进行了排序,而这种排序可以在类似使用过滤条件时加快查询速度。(...会使用已排序的块来避免扫描不必要的数据)
  2. 而分区就对数据有了明确划分,在插入时就把数据插入到不同分区中,且可以针对具体分区设置过期逻辑,实际上这时候分区就是一个小表,而原本的表,只是数个拥有共通数据架构的表的,共通概念体。