【发布时间】:2020-07-15 21:18:26
【问题描述】:
我正在努力使用日期或日期时间字段有效地查询表的最后一个分区。第一种方法是像这样过滤:
SELECT *
FROM my_table
WHERE observation_date = (SELECT MAX(observation_date) FROM my_table)
但是,根据 BigQuery 的处理估计,它会扫描整个表并且不使用分区。甚至谷歌也在他们的文档中声明这发生了。如果我对分区使用确切的值,它确实有效:
SELECT *
FROM my_table
WHERE observation_date = CURRENT_DATE
但是如果表不是最新的,那么查询将不会得到任何结果,并且我的自动处理将失败。如果我包含像observation_date = DATE_SUB(CURRENT_DATE, INTERVAL 2 DAY) 这样的偏移量,我可能会错过最新的分区。
高效获取最新分区的最佳做法是什么?
更糟糕的是,BigQuery 对活动查询要处理的字节数的估计与实际处理的字节数不匹配,除非我没有正确解释这些数字。在下面找到不匹配值的屏幕截图。
BigQuery screen with aparrently mistmatching processed bytes
最后我还测试了几个场景:
- 如果我按照in this post 的建议首先存储带有 DECLARE 语句的 max_date,估计似乎有效,但不清楚原因。但是,运行查询后实际处理的字节数与在 WHERE 子句中过滤最新分区的情况没有什么不同。
- 在分区和集群的表中使用相同声明的 max_date,估计仅在对分区使用过滤器时有效,但如果我为集群包含过滤器,则会失败。
【问题讨论】:
标签: google-bigquery partitioning cost-management