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


查询改写算法只需要考虑给定的查询表达式和视图 , 判断这个查询表达式能否从视图中计算出来,然后从视图上构造一个等价的补偿表达式,与原查询表达式等价 。查询改写的范围应该尽可能大,查询改写的目标是使用少量物化视图改写大量查询 。最终由优化器选择出一个最优的查询计划 。
查询改写检查优化器通过多种方式来改写查询 。最简单的一种情况是物化视图的查询与查询完全匹配,符合这种查询重写类型的查询数量很少 。为了进行更通用的匹配,优化器会尝试使用各种规则构造一个等价表达式改写查询 。
查询改写检查包含两个步骤,改写匹配检查和构建等价表达式 。一个查询能被视图回答需要满足下面两个条件:
物化视图 Join 关系在查询中存在物化视图有足够的数据来回答查询部分条件下即使不满足条件 , 视图也可能会被用于改写 。例如视图包含一部分查询所需要的数据,可以使用物化视图回答部分查询,剩下的数据从原始数据中计算 。这部分改写检查会放在高级改写规则中进行介绍 。
具体来说改写检查会依次进行 Join 检查和 Ouput 检查,如果查询或视图中含有 Grouping By 和 Aggregation,还会进行额外的检查,如果需要,会尝试对视图进一步聚合 。
Join 检查
当查询和视图的表的 Join 关系相同时,视图才可能包含查询需要的所有的行和列 。一种简单的方式是只考虑没有子查询的 Inner Join,这时只用比较查询表和数量是否完全一致即可 。或者通过一系列规则检查查询和视图的关系代数树包含的 Join 关系是等价的 。更通用的一种方法是构建 Join Graph 。Join Grpah 是一个以关系为结点 , 联接为边的图 。Inner Join 的条件表示为无向边,Outer Join 的条件表示为有向边 。Join Graph 由查询关系代数树构建而来,通过比较 Join Graph 就可以检查物化视图和查询包含相同的 Join 关系 。
例如对于下面的查询
select c_custkey, c_name, l_orderkey, l_partkey, l_quantityfrom (select l_orderkey,l_partkey, l_quantityfrom lineitemwhere l_orderkey < 1000and l_shipdate = l_commitdate) subqueryjoin orders on subquery.l_orderkey = o_orderkeyleft join customer on o_custkey = c_custkey对于物化视图
create materialized view mview1enable query rewrite asselect *from lineitem join customer On subquery.l_orderkey = o_orderkeyleft outer join orders On o_custkey = c_custkey查询和物化视图具有相同的 Join 关系,查询可以被改写
select c_custkey, c_name, l_orderkey,l_partkey, l_quantityfrom mview1where l_orderkey < 1000and l_shipdate = l_commitdateOutput 检查
Ouput 检查保证物化视图有足够的数据回答查询,这包括 3 个步骤:
验证查询所有输出需要的列能够从视图中计算出来优化器需要检查视图包含查询所有需要的行数,也就是视图的谓词的范围大于查询的范围补偿谓词能否从视图中计算得来等价关系
查询改写能够通过查询中的等价关系扩展改写的范围 。因为等值条件具有传递性 , 等价关系可以从等值条件或者代数关系推导而来 。例如可以从 A=date_format(now(), '%Y%m%D') 和 B=date_format(now(), '%Y%m%D'),因为函数是确定性的,可以得到 A=B,如果我们还有 inner join 的条件 B=C,可以进一步得到 A=B=C 。
可能会有某些其他的条件可以推导出等价关系,例如可以从 A=2,B=3,C=5 推导出 C = A + B 。相比等值关系,寻找这种关系会使搜索过程更加复杂,而且我们无法实现所有的可能的相等关系,因此很少考虑这样的表达式 。等价关系推导只搜索等值条件,即使可能错过一些改写机会,这样的浅层搜索可以保证速度 。

推荐阅读