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


表达式检查
为了确保查询输出的列和补偿谓词需要的列都能从视图中计算出来,我们需要一种方法确定来自查询的表达式是否和视图中的表达式相等,或者能从中计算出来 。表达式检查无法纯粹从语法上实现,两个表达式或者符号的文本相同,并不说明他们关系相等 。例如别名的存在就会破坏基于语法的检查 。
表达式检查需要通过等价关系和表的对应关系推导而来 。如果视图和查询中所有的表都是唯一的,那么来自同一个表的列是等价的;如果视图和查询中有表出现多次,即 self join,那么查询到视图的表的映射就存在多种可能,每种可能都需要进行一次改写尝试 。有了视图和查询之间列的对应关系和上一节的等价关系,通过代数系统确定来自查询的表达式是否和视图中的表达式相等,或者能否从中计算出来 。
存在一些启发式的规则,允许一个表达式从另外的表达式中计算出来 。比如算数规则从 x + 1 中计算出 x,例如 SUM(x) 和 COUNT(x) 计算出 AVG(x),还存在一些 Function Dependency 规则,例如时间函数,可以通过返回的天的结果计算年等 。
谓词检查
视图改写需要物化视图中存在查询所有需要的行数 , 即视图的谓词的范围大于或等于查询的范围 。使用 Wq 表示查询的谓词 , Wv表示视图的谓词,我们需要检查 Wq => Wv,其中 => 表示 Wq 满足 Wv 的含义 。
优化器提取所有的谓词,并将他们转换为 CNF 的形式,即 W=P1 ^ P2 ^ ... ^ Pn 。将谓词按照等值谓词 , 范围谓词和剩余谓词进一步分为 W= PE ^ PR ^ PU 。PE,PR , PU 分别代表等值谓词,范围谓词和剩余谓词 。谓词检查变成了 PEq ^ PRq ^ PUq => PEv ^ PRv ^ PUv,由于正交的性质,最终将问题分解成 PEq => PEv,PEq ^ PRq => PRv,PEq ^ PUq => PUv 三类检查 。
查询的等值谓词用于推导等价关系 。查询中任何视图不满足等价关系的谓词都构成补偿谓词,视图中存在查询无法满足的等价关系则无法改写 。
范围谓词在优化器中可以存储为范围的形式,可以方便的计算差集 。对于查询中每一个范围谓词,如果视图存在对应的范围精准匹配,不需要进行补偿,否则视图范围必须大于查询的范围,并通过差集构造一个补偿谓词 。
查询表达式和试图剩余的谓词共同构成剩余谓词PE,只能进行精准匹配 。查询中任何与视图不匹配的谓词都构成补偿谓词 。查询与视图不匹配则无法改写 。
所有的补偿谓词都需要通过表达式检查,确保可以从视图的输出中计算出来 。
例如查询
select l_orderkey, o_custkey, l_partkey,l_quantity*l_extendedpricefrom lineitem, orders, partwhere l_orderkey = o_orderkeyand l_partkey= p_partkeyand l_partkey >= 150 and l_partkey <= 160and o_custkey = 123and o_orderdate = l_shipdateand p_name like ‘%abc%’and l_quantity*l_extendedprice > 100物化视图
create materialized view mview2Enable Query Rewriteas select l_orderkey, o_custkey, l_partkey,l_shipdate, o_orderdate,l_quantity*l_extendedprice as gross_revenuefrom lineitem, orders, partwhere l_orderkey = o_orderkeyand l_partkey= p_partkeyand p_partkey >= 150and o_custkey >= 50 and o_custkey <= 500and p_name like ‘%abc%’查询可以被改写为
select l_orderkey, o_custkey, l_partkey, gross_revenuefrom mview2where l_partkey <= 160and o_custkey = 123and o_orderdate = l_shipdateand gross_revenue > 100Grouping 和 Aggregation 检查
如果视图和查询带有 GroupBy 或 Aggregation 函数 , 需要进行额外检查:
检查查询请求的数据分组是否与物化视图中存储的数据分组相同,如果不同,优化器会尝试对物化视图进行汇总 。如果需要进一步汇总计算,所有需要的列的都可以从视图输出中计算出来 。例如查询

推荐阅读