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


cpu代表什么意思  pu代表什么意思

文章插圖
如果查詢比視圖包含更多的表 , 我們可以簡單把缺少的 Join 添加在視圖之上 , 使其滿足改寫要求 。Join 條件會通過謂詞改寫正確的添加進來 , 優化器也可以通過后續規則調整計劃 。
Join 補償使優化器可以更早的進行匹配改寫 , 減少改寫的嘗試次數 。
例如如下查詢
select c_custkey, c_name, l_orderkey,l_partkey, l_quantityFrom lineitem, customer, ordersWhere l_orderkey = o_orderkeyAnd o_custkey = c_custkeyWhere l_orderkey between 1000 and 1500And l_shipdate = l_commitdate物化視圖
Create materialized view mview5Enable query rewrite asSelect l_orderkey,l_partkey, l_quantityFrom lineitem, ordersWhere l_orderkey = o_orderkeyAnd o_orderkey >= 500可以被改寫為
Select l_orderkey, l_partkey, l_quantityFrom mview5 join customer on o_custkey = c_custkeyWhere l_orderkey between 1000 and 1500And l_shipdate = l_commitdateJoin 消除
如果一個 Join 出現在視圖中但是沒有出現在查詢中 , 可以嘗試使用 Join 消除規則 。Join 消除是優化器優化中的一項常見 ***  , 如果 Join 滿足以下5個條件 , 則表 T1 在與表 T2 的聯接中時不變的:
聯接條件是一個簡單的等值條件T1.fk 是 T2.pk 的外鍵T1.fk 滿足非 null 約束T2 沒有任何的謂詞T2 在與 T1 以外的表的聯接是不變的這意味著表 T1 在與 T2 的 Join 關系不會影響 T1 的結果 , 視圖中的 T2 可以在 Join Graph 中忽略 。不變聯接的存在允許在基礎物化視圖上創建更大的并集或超集 , 從而允許物化視圖包含更大的預計算 , 也可以改寫更多的查詢 。
例如查詢
Select l_orderkey, l_partkey, l_quantityFrom lineitemWhere l_orderkey between 1000 and 1500And l_shipdate = l_commitdate物化視圖
Create materialized view mview6Enable query rewrite asSelect c_custkey, c_name, l_orderkey,l_partkey, l_quantityFrom lineitem, orders, customerWhere l_orderkey = o_orderkeyAnd o_custkey = c_custkeyAnd o_orderkey >= 500可以被改寫成
select l_orderkey, l_partkey, l_quantityfrom mview6where l_orderkey between 1000 and 1500and l_shipdate = l_commitdateJoin 派生
如果存在 Outer Join , 視圖和查詢 Join 關系不一致 , 可以嘗試利用 Join 派生性 , 從物化視圖中的聯接重新計算查詢中的聯接 。例如 , 能從物化視圖中的 left Outer Join 的結果里 , 計算 Inner Join , Anti Join 的結果 , Inner Join 又能進一步計算 Semi Join , 這樣就能使用物化視圖過濾某些行來回答不同具有不同 Join 關系的查詢 。
Join 派生可以擴展改寫的范圍 , 允許優化器將基于物化視圖的改寫與解關聯的規則規則結合 , 改寫帶有 IN , EXISTS 等的查詢 , 也可以避免其他優化規則對 Join 的調整 , 例如 EliminateOuterJoin 和 PredicatePushDown 可能會將 outer join 優化成 inner join 。
Union 改寫
物化視圖只包含一部分查詢所需的數據 , 也可以用于查詢改寫 。在很多場景下 , 物化視圖不會也無法存儲全部的數據 。
一個典型的情況是 , 數據在不斷的寫入 , 但是寫入只發生在最近一段時間內 。在持續刷新的表上構建全量物化視圖 , 這可能導致因為數據插入視圖頻繁刷新 , 產生高昂的刷新成本 , 甚至視圖因為持續刷新而完全不可用 。更好的做法是構建一個 T+1 條件刷新的物化視圖 , 存儲不變的數據 , 可以降低刷新成本 。
另一種常見的情況是 , 數據倉庫存儲全量的數據 , 而查詢集中在最近幾個月的數據 , 構建全部數據的物化視圖成本過于高昂 , 物化視圖只構建最近幾個月數據 , 也能改寫絕大多數查詢 。
cpu代表什么意思  pu代表什么意思

文章插圖
Union 改寫會嘗試使用視圖回答部分查詢 , 減少查詢中實時計算的數據量 。Union 改寫可以進一步應用 Aggregation 改寫 , 支持使用物化視圖部分數據回答聚合查詢 。
例如查詢
select l_orderkey, l_partkey, l_quantityfrom lineitemwhere l_orderkey l_orderkey > 500 and l_orderkey <= 1500and l_shipdate = l_commitdate物化視圖
create materialized view mview8enable query rewriteasselect l_orderkey, l_partkey, l_quantityfrom lineitemwhere l_orderkey > 1000and l_shipdate = l_commitdate改寫結果
select l_orderkey, l_partkey, l_quantityfrom lineitemwhere l_orderkey > 500 and l_orderkey <= 1000and l_shipdate = l_commitdateunionselect o.shippriorityfrom mview8where l_orderkey > 1000 and l_orderkey <= 1500查詢改寫的實現視圖改寫通常有三種查詢改寫的實現方式:

推薦閱讀