日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

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


查詢改寫算法只需要考慮給定的查詢表達(dá)式和視圖 , 判斷這個查詢表達(dá)式能否從視圖中計算出來,然后從視圖上構(gòu)造一個等價的補償表達(dá)式,與原查詢表達(dá)式等價 。查詢改寫的范圍應(yīng)該盡可能大,查詢改寫的目標(biāo)是使用少量物化視圖改寫大量查詢 。最終由優(yōu)化器選擇出一個最優(yōu)的查詢計劃 。
查詢改寫檢查優(yōu)化器通過多種方式來改寫查詢 。最簡單的一種情況是物化視圖的查詢與查詢完全匹配,符合這種查詢重寫類型的查詢數(shù)量很少 。為了進(jìn)行更通用的匹配,優(yōu)化器會嘗試使用各種規(guī)則構(gòu)造一個等價表達(dá)式改寫查詢 。
查詢改寫檢查包含兩個步驟,改寫匹配檢查和構(gòu)建等價表達(dá)式 。一個查詢能被視圖回答需要滿足下面兩個條件:
物化視圖 Join 關(guān)系在查詢中存在物化視圖有足夠的數(shù)據(jù)來回答查詢部分條件下即使不滿足條件 , 視圖也可能會被用于改寫 。例如視圖包含一部分查詢所需要的數(shù)據(jù),可以使用物化視圖回答部分查詢,剩下的數(shù)據(jù)從原始數(shù)據(jù)中計算 。這部分改寫檢查會放在高級改寫規(guī)則中進(jìn)行介紹 。
具體來說改寫檢查會依次進(jìn)行 Join 檢查和 Ouput 檢查,如果查詢或視圖中含有 Grouping By 和 Aggregation,還會進(jìn)行額外的檢查,如果需要,會嘗試對視圖進(jìn)一步聚合 。
Join 檢查
當(dāng)查詢和視圖的表的 Join 關(guān)系相同時,視圖才可能包含查詢需要的所有的行和列 。一種簡單的方式是只考慮沒有子查詢的 Inner Join,這時只用比較查詢表和數(shù)量是否完全一致即可 ?;蛘咄ㄟ^一系列規(guī)則檢查查詢和視圖的關(guān)系代數(shù)樹包含的 Join 關(guān)系是等價的 。更通用的一種方法是構(gòu)建 Join Graph 。Join Grpah 是一個以關(guān)系為結(jié)點 , 聯(lián)接為邊的圖 。Inner Join 的條件表示為無向邊,Outer Join 的條件表示為有向邊 。Join Graph 由查詢關(guān)系代數(shù)樹構(gòu)建而來,通過比較 Join Graph 就可以檢查物化視圖和查詢包含相同的 Join 關(guān)系 。
例如對于下面的查詢
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 關(guān)系,查詢可以被改寫
select c_custkey, c_name, l_orderkey,l_partkey, l_quantityfrom mview1where l_orderkey < 1000and l_shipdate = l_commitdateOutput 檢查
Ouput 檢查保證物化視圖有足夠的數(shù)據(jù)回答查詢,這包括 3 個步驟:
驗證查詢所有輸出需要的列能夠從視圖中計算出來優(yōu)化器需要檢查視圖包含查詢所有需要的行數(shù),也就是視圖的謂詞的范圍大于查詢的范圍補償謂詞能否從視圖中計算得來等價關(guān)系
查詢改寫能夠通過查詢中的等價關(guān)系擴展改寫的范圍 。因為等值條件具有傳遞性 , 等價關(guān)系可以從等值條件或者代數(shù)關(guān)系推導(dǎo)而來 。例如可以從 A=date_format(now(), '%Y%m%D') 和 B=date_format(now(), '%Y%m%D'),因為函數(shù)是確定性的,可以得到 A=B,如果我們還有 inner join 的條件 B=C,可以進(jìn)一步得到 A=B=C 。
可能會有某些其他的條件可以推導(dǎo)出等價關(guān)系,例如可以從 A=2,B=3,C=5 推導(dǎo)出 C = A + B 。相比等值關(guān)系,尋找這種關(guān)系會使搜索過程更加復(fù)雜,而且我們無法實現(xiàn)所有的可能的相等關(guān)系,因此很少考慮這樣的表達(dá)式 。等價關(guān)系推導(dǎo)只搜索等值條件,即使可能錯過一些改寫機會,這樣的淺層搜索可以保證速度 。

推薦閱讀