BigQuery 中的分区如何工作?

Posted

技术标签:

【中文标题】BigQuery 中的分区如何工作?【英文标题】:How does partitioning in BigQuery works? 【发布时间】:2020-10-12 03:08:22 【问题描述】:

大家好:我想了解分区表是如何工作的。我有一个大小为 12.9MB 的销售表。我有一个按天分区的日期列。我的假设是,当我使用此日期列过滤数据表时,BigQuery 处理的数据量将得到优化。但是,它似乎并没有那样工作,我想了解原因。 在下面的查询中,我使用子查询过滤 sales.date。当我尝试这样执行查询时,它正在处理 12.9 MB 的整个表。

但是,如果我将下面的子查询替换为实际日期(与子查询的结果相同),则处理的数据量为 4.9 MB。

子查询单独处理 630 KB 的数据。如果我的理解是正确的,下面给出的查询过程不应该是 4.9 MB + 630 KB = ~ 5.6 MB 吗?但是,它仍然处理 12.9 MB。有人能解释一下这里发生了什么吗?

SELECT 
sales.*,
FROM `my-project.transaction_data.sales_table` sales
WHERE DATE(sales.date) >= DATE_SUB(DATE((select max(temp.date) FROM ` my-project.transaction_data.sales_table ` temp)), INTERVAL 2 YEAR)
ORDER BY sales.customer, sales.date

【问题讨论】:

【参考方案1】:

有人能解释一下这里发生了什么吗?

这是预期行为

一般而言,如果可以在查询开始时评估过滤器而不需要任何子查询评估或数据扫描,则分区修剪将降低查询成本

需要对查询的多个阶段进行评估以解析谓词(例如内部查询或子查询)的复杂查询不会从查询中删除分区。

在Querying partitioned tables查看更多信息

可能的解决方法是使用脚本,您将首先计算实际日期并将其分配给变量,然后在查询中使用它,从而消除子查询

【讨论】:

以上是关于BigQuery 中的分区如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google BigQuery 的记录中查询字符串?文档不工作

BigQuery 在时间分区表上的缓存如何工作?

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

使用 Apache Beam 向 BigQuery 传播插入时如何指定 insertId

列中的 BigQuery 日期分区

如何从手动分区的 BigQuery 表中引用最新表