在bigquery中使用_PARTITIONTIME子查询不会限制成本

Aks*_*pta 3 subquery google-bigquery

当我使用标准 SQL 在 BQ 上运行以下查询时,它表示运行时将处理 76.6TB

SELECT 
event_time, user_id, activity_id,dbm_insertion_order_id, dbm_total_media_cost_usd 
FROM `raw.5295.activity_*`
WHERE _PARTITIONTIME >(SELECT * FROM `analytics-dwh.autobidding.activity_list` )
AND timestamp_micros(event_time)  > (SELECT timestamp_micros(MAX(event_time)) from `essence-analytics-dwh.ml_for_autobidding.nest_na_4q18_activity_updated_daily`)
AND _TABLE_SUFFIX IN ('25','20')
Run Code Online (Sandbox Code Playgroud)

表analytics-dwh.autobidding.activity_list只有一列,其中包含唯一的整数列表

如果我从上表中删除子查询,则该查询在运行时使用的内存将少于 500GB

SELECT 
event_time, user_id, activity_id,dbm_insertion_order_id, dbm_total_media_cost_usd 
FROM `raw.5295.activity_*`
WHERE _PARTITIONTIME >TIMESTAMP('2018-12-20')
AND timestamp_micros(event_time)  > (SELECT timestamp_micros(MAX(event_time)) from `essence-analytics-dwh.ml_for_autobidding.nest_na_4q18_activity_updated_daily`)
AND _TABLE_SUFFIX IN ('25','20')
Run Code Online (Sandbox Code Playgroud)

为什么当我使用子查询时会发生这种情况?有解决方法吗?

Mik*_*ant 6

为什么使用子查询会发生这种情况?

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

您可以查看更多关于使用伪列限制查询分区

因此,在您的第一个查询(使用子查询的地方)中 - 修剪没有发生(它不会根据涉及子查询的条件限制分区的使用)

在第二个查询中,您使用_PARTITIONTIME >TIMESTAMP('2018-12-20')分区受到限制

底线:包含子查询的 _PARTITIONTIME 过滤器不能用于限制为分区表扫描的分区数量。

有解决方法吗?

您应该将任务分为两个步骤:使用表外所需的任何逻辑计算 _PARTITIONTIME 的过滤器analytics-dwh.autobidding.activity_list,然后使用它(而不是子查询) - 使用您选择的任何客户端