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


查询改写检查包含两个步骤 , 改写匹配检查和构建等价表达式 。一个查询能被视图回答需要满足下面两个条件:
物化视图 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 。相比等值关系 , 寻找这种关系会使搜索过程更加复杂 , 而且我们无法实现所有的可能的相等关系 , 因此很少考虑这样的表达式 。等价关系推导只搜索等值条件 , 即使可能错过一些改写机会 , 这样的浅层搜索可以保证速度 。
表达式检查
为了确保查询输出的列和补偿谓词需要的列都能从视图中计算出来 , 我们需要一种 *** 确定来自查询的表达式是否和视图中的表达式相等 , 或者能从中计算出来 。表达式检查无法纯粹从语法上实现 , 两个表达式或者符号的文本相同 , 并不说明他们关系相等 。例如别名的存在就会破坏基于语法的检查 。
表达式检查需要通过等价关系和表的对应关系推导而来 。如果视图和查询中所有的表都是唯一的 , 那么来自同一个表的列是等价的;如果视图和查询中有表出现多次 , 即 self join , 那么查询到视图的表的映射就存在多种可能 , 每种可能都需要进行一次改写尝试 。有了视图和查询之间列的对应关系和上一节的等价关系 , 通过代数系统确定来自查询的表达式是否和视图中的表达式相等 , 或者能否从中计算出来 。
存在一些启发式的规则 , 允许一个表达式从另外的表达式中计算出来 。比如算数规则从 x + 1 中计算出 x , 例如 SUM(x) 和 COUNT(x) 计算出 AVG(x) , 还存在一些 Function Dependency 规则 , 例如时间函数 , 可以通过返回的天的结果计算年等 。

推荐阅读