cpu代表什么意思 pu代表什么意思( 四 )


cpu代表什么意思  pu代表什么意思

文章插图
如果查询比视图包含更多的表 , 我们可以简单把缺少的 Join 添加在视图之上 , 使其满足改写要求 。Join 条件会通过谓词改写正确的添加进来 , 优化器也可以通过后续规则调整计划 。
Join 补偿使优化器可以更早的进行匹配改写 , 减少改写的尝试次数 。
例如如下查询
select c_custkey, c_name, l_orderkey,l_partkey, l_quantityFrom lineitem, customer, ordersWhere l_orderkey = o_orderkeyAnd o_custkey = c_custkeyWhere l_orderkey between 1000 and 1500And l_shipdate = l_commitdate物化视图
Create materialized view mview5Enable query rewrite asSelect l_orderkey,l_partkey, l_quantityFrom lineitem, ordersWhere l_orderkey = o_orderkeyAnd o_orderkey >= 500可以被改写为
Select l_orderkey, l_partkey, l_quantityFrom mview5 join customer on o_custkey = c_custkeyWhere l_orderkey between 1000 and 1500And l_shipdate = l_commitdateJoin 消除
如果一个 Join 出现在视图中但是没有出现在查询中 , 可以尝试使用 Join 消除规则 。Join 消除是优化器优化中的一项常见 ***  , 如果 Join 满足以下5个条件 , 则表 T1 在与表 T2 的联接中时不变的:
联接条件是一个简单的等值条件T1.fk 是 T2.pk 的外键T1.fk 满足非 null 约束T2 没有任何的谓词T2 在与 T1 以外的表的联接是不变的这意味着表 T1 在与 T2 的 Join 关系不会影响 T1 的结果 , 视图中的 T2 可以在 Join Graph 中忽略 。不变联接的存在允许在基础物化视图上创建更大的并集或超集 , 从而允许物化视图包含更大的预计算 , 也可以改写更多的查询 。
例如查询
Select l_orderkey, l_partkey, l_quantityFrom lineitemWhere l_orderkey between 1000 and 1500And l_shipdate = l_commitdate物化视图
Create materialized view mview6Enable query rewrite asSelect c_custkey, c_name, l_orderkey,l_partkey, l_quantityFrom lineitem, orders, customerWhere l_orderkey = o_orderkeyAnd o_custkey = c_custkeyAnd o_orderkey >= 500可以被改写成
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 条件刷新的物化视图 , 存储不变的数据 , 可以降低刷新成本 。
另一种常见的情况是 , 数据仓库存储全量的数据 , 而查询集中在最近几个月的数据 , 构建全部数据的物化视图成本过于高昂 , 物化视图只构建最近几个月数据 , 也能改写绝大多数查询 。
cpu代表什么意思  pu代表什么意思

文章插图
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查询改写的实现视图改写通常有三种查询改写的实现方式:

推荐阅读