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


谓词检查
视图改写需要物化视图中存在查询所有需要的行数 , 即视图的谓词的范围大于或等于查询的范围 。使用 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 函数 , 需要进行额外检查:
检查查询请求的数据分组是否与物化视图中存储的数据分组相同 , 如果不同 , 优化器会尝试对物化视图进行汇总 。如果需要进一步汇总计算 , 所有需要的列的都可以从视图输出中计算出来 。例如查询
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 关系 不一致有两种情况:查询比视图包含更多的联接 , 或者视图包含更多的联接 。

推荐阅读