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 , 只能進行精準匹配 。查詢中任何與視圖不匹配的謂詞都構成補償謂詞 。查詢與視圖不匹配則無法改寫 。
所有的補償謂詞都需要通過表達式檢查 , 確??梢詮囊晥D的輸出中計算出來 。
例如查詢
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 關系 不一致有兩種情況:查詢比視圖包含更多的聯接 , 或者視圖包含更多的聯接 。

推薦閱讀