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 規則 , 例如時間函數 , 可以通過返回的天的結果計算年等 。

推薦閱讀