Vertica创建视图时/*+ENABLE_WITH_CLAUSE_MATERIALIZATION */提示是否生效?
Vertica视图内部WITH物化提示失效解决方法
失效原因
Vertica优化器默认会对视图定义进行子查询合并操作,展开视图时会丢弃内部WITH子句上的/*+ENABLE_WITH_CLAUSE_MATERIALIZATION */提示,导致原有物化逻辑不生效,该问题属于版本隐性行为,未在官方文档公开标注。
解决方案
- 方案1:外层查询显式加提示
每次调用视图时,在外层查询语句添加物化提示,优先级高于视图内部定义,可直接生效,示例代码:SELECT /*+ENABLE_WITH_CLAUSE_MATERIALIZATION */ * FROM view_name; - 方案2:视图定义增加不合并提示
在视图的最终SELECT语句中添加/*+NO_MERGE */提示,强制优化器不拆解合并视图结构,保留内部WITH物化逻辑,修改后的视图定义示例:create view view_name as with /*+ENABLE_WITH_CLAUSE_MATERIALIZATION */ report_quarters as -- 此处保留原有WITH子句的全部业务逻辑 SELECT /*+NO_MERGE */ * FROM report_quarters;
生效验证
执行查询前添加EXPLAIN关键字查看执行计划,若计划中出现Temp With Materialization节点,即说明物化提示已生效。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

