0

我正在努力使用日期或日期时间字段有效地查询表的最后一个分区。第一种方法是像这样过滤:

SELECT *
FROM my_table
WHERE observation_date = (SELECT MAX(observation_date) FROM my_table)

但是,根据 BigQuery 的处理估计,它会扫描整个表并且不使用分区。甚至谷歌也在他们的文档中声明这发生了。如果我为分区使用确切的值,它确实有效:

SELECT *
FROM my_table
WHERE observation_date = CURRENT_DATE

但是如果表不是最新的,那么查询将不会得到任何结果,并且我的自动进程将失败。如果我包含像观察日期 = DATE_SUB(CURRENT_DATE, INTERVAL 2 DAY) 这样的偏移量,我可能会错过最新的分区。

有效获取最新分区的最佳做法是什么?

更糟糕的是,BigQuery 对要使用活动查询处理的字节的估计与实际处理的不匹配,除非我没有正确解释这些数字。在不匹配值的屏幕截图下方找到。

BigQuery 屏幕的处理字节明显不匹配

最后,我还测试了几个场景:

  • 如果我按照这篇文章中的建议首先存储带有 DECLARE 语句的 max_date,估计似乎有效,但不清楚原因。但是,运行查询后实际处理的字节数与在 WHERE 子句中过滤最新分区的情况没有什么不同。
  • 在分区和集群的表中使用相同的声明 max_date,估计仅在使用分区过滤器时有效,但如果我为集群包含过滤器则失败。
4

1 回答 1

0

经过一些迭代后,我得到了谷歌的回答,虽然它没有解决问题,但它承认它确实发生了。

使用 DATE 或 DATETIME 字段分区的表无法有效地查询其最新分区。最佳做法仍然是使用 WHERE observation_date = (SELECT MAX(observation_date) FROM my_table) 之类的东西进行过滤,这将扫描整个表。

他们做了笔记以尝试在未来改进这一点,但我们现在必须处理这个问题。我希望这可以帮助那些试图做同样事情的人。

于 2020-10-23T15:35:27.127 回答