BigQuery定时SQL查询无法同时用分区字段与其他字段做WHERE过滤
问题原因
- 你的
myTable是按insert_timestamp字段创建的分区表,且表开启了必须使用分区列过滤才能查询的强制限制,用于避免全表扫描产生不必要的算力成本 - BigQuery定时查询的静态预校验阶段,当WHERE子句仅包含分区列的时间过滤规则时,系统可以直接识别到合法的分区剪枝条件,校验通过;当你额外追加其他AND条件后,预校验逻辑无法正确识别包裹了
@run_time调度参数的表达式属于合法分区剪枝过滤,误判你未添加分区列筛选规则,因此触发报错。
解决方案
- 方法1:将分区筛选条件用括号单独包裹,提示优化器该条件的优先级,可解决预校验识别问题,代码示例:
DECLARE runTimeVariable TIMESTAMP DEFAULT @run_time; SELECT * FROM `myTable` WHERE (insert_timestamp > timestamp_sub(runTimeVariable, INTERVAL 7 DAY)) AND x > 0
- 方法2:直接在分区过滤条件中使用
@run_time参数,不提前声明变量,规避预校验识别失败问题,代码示例:
SELECT * FROM `myTable` WHERE insert_timestamp > timestamp_sub(@run_time, INTERVAL 7 DAY) AND x > 0
- 方法3:如果确认可以接受全表扫描的风险和成本,也可以关闭表的强制分区筛选限制,执行命令如下:
ALTER TABLE `myTable` SET OPTIONS (require_partition_filter = FALSE);
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

