【问题标题】:Using subquery for _PARTITIONTIME in bigquery does not limit cost在 bigquery 中使用 _PARTITIONTIME 的子查询不会限制成本
【发布时间】:2019-01-10 19:42:16
【问题描述】:

当我使用标准 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')

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')

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

【问题讨论】:

标签: google-bigquery subquery


【解决方案1】:

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

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

你可以看到更多关于Limiting partitions queried using pseudo columns的信息

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

在第二个查询中你使用_PARTITIONTIME >TIMESTAMP('2018-12-20') 所以分区是有限的

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

有解决方法吗?

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

【讨论】:

  • 抱歉回复晚了,非常感谢。这很有帮助
  • @AksharGupta 答案有帮助吗?请注意,您一直在提问而不是接受答案。
【解决方案2】:

通过查看您的查询,我假设您想从中选择 MIN 或 MAX 日期:

SELECT * FROM `analytics-dwh.autobidding.activity_list`

并将其传递给查询的第二部分

这可以通过在代码中使用BigQuery API 来完成,该代码将在两个步骤之间传递值(例如 Python 或 Javascript)

【讨论】:

  • 好点。很抱歉没有早点回复。谢天谢地,米哈伊尔的回答解决了这个问题,但我认为你在这里提到的内容也会有所帮助
猜你喜欢
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多