创建物化视图后源表分区功能失效,查询触发全表扫描
物化视图导致源表分区失效问题成因及解决方案

问题成因
- 查询触发物化视图自动重写:优化器自动将你的查询路由到了未做分区的
processed_sessions_cust物化视图,而非源表processed_sessions,因此你指定的分区过滤条件仅作用在全量预存的物化视图上,不会触发源表的分区裁剪,最终扫描全量150GB数据。 - 物化视图分区规则不匹配:创建
processed_sessions_cust时未使用和processed_sessions相同的分区键做分区,也未将分区键作为物化视图的保留字段,导致分区过滤条件无法传递到源表生效。 - 优化器分区下推能力受限:部分大数据引擎、数据库的优化器默认未开启跨视图的过滤条件下推能力,无法识别到可以将上层查询的分区过滤条件应用到下层源表的分区元数据上,导致分区裁剪失效。
解决方法
- 临时关闭当前查询的物化视图重写:如果业务需要直接读取源表分区数据,可在查询语句前添加对应引擎的关闭重写Hint,强制查询路由到源表:
- Spark SQL:
/*+ NO_MERGE_VIEW(processed_sessions_cust) */ - BigQuery:
/*+ DISABLE_MATERIALIZED_VIEW(processed_sessions_cust) */ - Hive:
/*+ NOVIEWREWRITING */
- Spark SQL:
- 对物化视图做分区适配改造:重建
processed_sessions_cust,使用和源表完全一致的分区键做分区,同时将分区键作为物化视图的常规保留字段,聚合场景下需要将分区键加入GROUP BY子句。改造后你的分区过滤条件可以直接裁剪物化视图的对应分区,仅扫描1GB左右的单日数据。 - 开启引擎的分区下推配置:如果使用Hive/Spark SQL引擎,可在会话级别开启参数,强制优化器下推过滤条件到源表:
set hive.optimize.ppd=true; set hive.optimize.ppd.view=true;
内容的提问来源于stack exchange,提问作者Silver Ringvee
相关产品推荐
相关产品推荐

