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可以被改写成
推荐阅读
- 梦到给别人擦鞋子 梦到给别人擦鞋子是什么意思
- 梦到公婆去世 梦到公婆死了是什么预兆
- 梦到偷拆邻居快递 梦到偷拆邻居快递什么意思
- 车上p三撇是什么意思?
- 苏铁是什么植物 苏铁是什么植物裸子还是被子
- 怎么看什么时候换轮胎 怎样判断什么时候更换轮胎
- 梦到有山有水的地方 梦到有山有水的地方是什么意思
- 梦到扔鞋子 梦到扔鞋子是什么意思
- 梦到烧火熏肉 梦到烧火熏肉是什么意思
- 办社保卡需要什么要求 办社保卡需要什么条件
