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


select c_nationkey, sum(l_quantity*l_extendedprice)from lineitem, orders, customerwhere l_orderkey = o_orderkeyand o_custkey = c_custkeygroup by c_nationkey物化视图
create materialized view mview3enable Query rewrite asselect o_custkey, count_big(*) as cnt, sum(l_quantity*l_extendedprice) as revenuefrom lineitem, orderswhere l_orderkey = o_orderkeygroup by o_custkey查询可以被改写为
select c_nationkey, sum(revenue)from customer join mview3 on c_custkey = o_custkeygroup by c_nationkey如果分组列表不同,只能改写 Group By 在查询最外部的情况 , 否则无法进行进一步聚合,无法满足第二个改写要求 。只有特定的聚合函数支持进一步聚合 , 常见的聚合函数有 MIN,MAX , SUM,COUNT 。
例如如下查询
select o_custkey, count(*) as cnt, sum(l_quantity*l_extendedprice) as revenuefrom lineitem, orderswhere l_orderkey = o_orderkeygroup by o_custkey物化视图
create materialized view mview4 enable Query rewrite asselect o_custkey, l_partkey, count(*) as cnt, sum(l_quantity*l_extendedprice) as revenuefrom lineitem, orderswhere l_orderkey = o_orderkeygroup by o_custkey, l_partkey可以被改写为
select c_nationkey, sum(cnt) as cnt, sum(revenue) as revenuefrom mview4where c_custkey = o_custkeygroup by o_custkey如果聚合函数在视图中不存在,可以通过一些规则进行计算 , 例如从 SUM(x) 和 COUNT(x) 计算出 AVG(x) , 从 SUM(x) + SUM(y) 中计算出 SUM(x + y),这些依赖表达式改写检查中启发式的规则 。
高级改写规则如果物化视图和查询不满足上一节的改写规则,还可以通过其他规则进行转换 。
Join 补偿
如果只考虑 Inner Join , 视图和查询的 Join 关系 不一致有两种情况:查询比视图包含更多的联接 , 或者视图包含更多的联接 。

如果查询比视图包含更多的表 , 我们可以简单把缺少的 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可以被改写成

推荐阅读