pu代表什么意思 pua代表什么意思( 五 )


select l_orderkey, l_partkey, l_quantityfrom mview6where l_orderkey between 1000 and 1500and l_shipdate = l_commitdateJoin 派生
如果存在 Outer Join,视图和查询 Join 关系不一致,可以尝试利用 Join 派生性,从物化视图中的联接重新计算查询中的联接 。例如,能从物化视图中的 left Outer Join 的结果里,计算 Inner Join,Anti Join 的结果 , Inner Join 又能进一步计算 Semi Join,这样就能使用物化视图过滤某些行来回答不同具有不同 Join 关系的查询 。
Join 派生可以扩展改写的范围 , 允许优化器将基于物化视图的改写与解关联的规则规则结合 , 改写带有 IN,EXISTS 等的查询 , 也可以避免其他优化规则对 Join 的调整,例如 EliminateOuterJoin 和 PredicatePushDown 可能会将 outer join 优化成 inner join 。
Union 改写
物化视图只包含一部分查询所需的数据,也可以用于查询改写 。在很多场景下 , 物化视图不会也无法存储全部的数据 。
一个典型的情况是,数据在不断的写入,但是写入只发生在最近一段时间内 。在持续刷新的表上构建全量物化视图,这可能导致因为数据插入视图频繁刷新,产生高昂的刷新成本,甚至视图因为持续刷新而完全不可用 。更好的做法是构建一个 T+1 条件刷新的物化视图,存储不变的数据,可以降低刷新成本 。
另一种常见的情况是,数据仓库存储全量的数据 , 而查询集中在最近几个月的数据 , 构建全部数据的物化视图成本过于高昂,物化视图只构建最近几个月数据,也能改写绝大多数查询 。

Union 改写会尝试使用视图回答部分查询,减少查询中实时计算的数据量 。Union 改写可以进一步应用 Aggregation 改写,支持使用物化视图部分数据回答聚合查询 。
例如查询
select l_orderkey, l_partkey, l_quantityfrom lineitemwhere l_orderkey l_orderkey > 500 and l_orderkey <= 1500and l_shipdate = l_commitdate物化视图
create materialized view mview8enable query rewriteasselect l_orderkey, l_partkey, l_quantityfrom lineitemwhere l_orderkey > 1000and l_shipdate = l_commitdate改写结果
select l_orderkey, l_partkey, l_quantityfrom lineitemwhere l_orderkey > 500 and l_orderkey <= 1000and l_shipdate = l_commitdateunionselect o.shippriorityfrom mview8where l_orderkey > 1000 and l_orderkey <= 1500查询改写的实现视图改写通常有三种查询改写的实现方式:
基于语法的改写基于规则的改写基于结构的改写基于语法的改写
文本匹配或者语法匹配是最简单的改写方法,将查询的文本与物化视图的文本或语法树进行比较,完全匹配可以进行改写 。这种改写只能匹配完整的查询语句或子语句,细微的变化就会导致查询无法改写,适用的范围很小 。基于语法的改写虽然简单 , 但是效率很高 , 改写的成本可以忽略不计 。
基于规则的改写
基于规则的改写和其他优化器规则相同,针对不同 Pattern 的查询和视图编写不同的规则,寻找等价的替代关系树 。
最简单的一条规则就是直接比较子查询和视图的计划 , 如果相同就能改写 。高级的改写规则不需要物化视图等同于被替换的计划 , 会尝试计算补偿谓词 , 构建等价查询表达式 。例如 Join 改写,比较 Join 查询的子表达式是否和视图 Join 的某个子表达相同或者能否从中计算出来,每一个Join子表达式都存在映射关系,最后检查补偿表达式能否从视图中计算得到 。
基于规则的改写可以实现大量重写,实现也比较简单 , 改写匹配速度快,但是也存在局限性 。这种改写依赖转换规则来寻找等价关系 , 因此需要穷举所有可能的转换关系来实现复杂视图的重写 。一些复杂的视图不可能穷举所有的等价关系,例如存在很多的 Join 联接或者复杂的 Project 关系,基于规则的改写适用的范围取决于规则的数量 。

推荐阅读