如果我们在 BigQuery 中使用具有相同分区类型(天)的另一列进行过滤,where 子句中的分区列是不是不是必需的?

Posted

技术标签:

【中文标题】如果我们在 BigQuery 中使用具有相同分区类型(天)的另一列进行过滤,where 子句中的分区列是不是不是必需的?【英文标题】:Is partition column in where clause not mandatory in case we are filtering using another column which is of same partition type(day) in BigQuery?如果我们在 BigQuery 中使用具有相同分区类型(天)的另一列进行过滤,where 子句中的分区列是否不是必需的? 【发布时间】:2020-06-29 09:54:51 【问题描述】:

我有一个基于 BigQuery 中的 month(月份开始日期)列分区的表,当我尝试根据另一列 last_updated 过滤记录时,我可以观察到(date) 列,但未指定分区发生的月份,BigQuery 仅获取 last_updated 范围所在的分区的记录

    如果我们基于相似列进行过滤,是否不强制使用分区列?

架构:名称、状态、last_updated、月、季度、年。 表按月份列分区,包含 11 条记录,其中 5 条记录为 6 月。 我可以在执行详细信息中看到选择为 5 的输入行并输出为 1

SELECT 
*
FROM 
   <dataset>.test_part 
WHERE  last_updated = '2020-06-16

即使没有明确提及月份列,正在选择分区

【问题讨论】:

【参考方案1】:

当您创建分区表时,它被划分为不同的段,称为分区,这使您更容易管理数据,因为当您使用分区列查询数据时,您只需要检查该分区而无需检查其他分区。但是,如果您在 where 子句中使用另一列,则无法保证 dremel 将处理比在 where 子句中使用分区列更多的数据。

您可以参考此文档以更好地了解其工作原理 [1]。

[1]https://cloud.google.com/bigquery/docs/partitioned-tables

【讨论】:

以上是关于如果我们在 BigQuery 中使用具有相同分区类型(天)的另一列进行过滤,where 子句中的分区列是不是不是必需的?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BigQuery 中使用连接修剪分区?

如何将分区表复制到 BigQuery 中的另一个分区表

BigQuery 会将记录移动到正确的分区中吗?

在 Bigquery 中使用 Job Config 创建范围分区表

通过 CLI 将存储桶中的 AVRO 加载到具有日期分区的 BigQuery 中

BigQuery 中的分区表