我正在努力使用日期或日期时间字段有效地查询表的最后一个分区。第一种方法是像这样过滤:
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 对要使用活动查询处理的字节的估计与实际处理的不匹配,除非我没有正确解释这些数字。在不匹配值的屏幕截图下方找到。
最后,我还测试了几个场景:
- 如果我按照这篇文章中的建议首先存储带有 DECLARE 语句的 max_date,估计似乎有效,但不清楚原因。但是,运行查询后实际处理的字节数与在 WHERE 子句中过滤最新分区的情况没有什么不同。
- 在分区和集群的表中使用相同的声明 max_date,估计仅在使用分区过滤器时有效,但如果我为集群包含过滤器则失败。