open內(nèi)核分析(四):查詢重寫
查詢重寫
SQL語言是多種語言的,也是多種不同的,不同的不同類型的不同經(jīng)驗的不同,開發(fā)的SQL語句也是各式各樣的,另外SQL語言可以通過數(shù)據(jù)庫的工具自動生成。只是想要的結(jié)果,而不是有趣的數(shù)據(jù),獲取數(shù)據(jù)庫的 SQL 表現(xiàn)形式的語言表達方式,直接包含了一些最佳信息,這些信息可以被使用來查詢查詢把SQL語句轉(zhuǎn)換為用戶輸入的等價查詢,查詢遵循更高效的SQL語句。
等相同:原語句結(jié)果和后價格的語句,輸出。
高效性:后的語句,比原語句在執(zhí)行時間和資源使用上更高效。
實例計算可以優(yōu)化既定式可以基于關(guān)系的代查詢優(yōu)化,例如詞下推、子查詢等,也可以根據(jù)查詢規(guī)則進行優(yōu)化,例如外部連接、連接查詢等。查詢是基于規(guī)則的查詢表邏輯優(yōu)化。
在代碼形式中,查詢查詢的架構(gòu):

下連接外連接外2連接外連接外連接或外連接連接轉(zhuǎn)右外連接過程:在外連接中,如果查詢條件中邏輯上能夠包含IS NOT,c1 > 0,可以將查詢轉(zhuǎn)換成INNER JOIN,從而減少關(guān)聯(lián)處理產(chǎn)生中間結(jié)果集。
外連接去掉Outer2Inner
下面首先以一個例子來說明各種多表連接方式的區(qū)別:

內(nèi)連接內(nèi)連接:返回兩個表都滿足的組合,相當(dāng)于取兩個表的交集。
左連接左外連接:返回左表中的所有行,如果左表中行在右表中沒有匹配行,則結(jié)果中右表中的列返回空值。
右連接右外連接:返回右表中的所有行,如果右表中行在左表中沒有匹配行,則結(jié)果中左表中的列返回空值。
連接全連接:表和右表中的所有行。當(dāng)某行返回左表中沒有匹配行時,則另一個中列空值,取兩個表并集。

在以上實驗的基礎(chǔ)上增加t2表的where條件。

left join和inner join的結(jié)果是一樣的,這是因為查詢條件中包含WHERE t2.c2 >100這個條件,t2表所有不匹配查詢元組均被掉(包括空值過濾),因此可以進行轉(zhuǎn)換left -outer join>inner join,能夠產(chǎn)生有效的t1和t2關(guān)聯(lián)產(chǎn)生結(jié)果集,達到性能提升的目的。
在數(shù)據(jù)庫系統(tǒng)中,查看是否有 RTE_JOIN 類型的節(jié)點存在,設(shè)置是否有 RTE_JOIN 類型的節(jié)點,在數(shù)據(jù)庫系統(tǒng)中,直接進入到reduce_outer_joins接口,滿足外部連接時再執(zhí)行連接的刪除。reduce_outer_Joins函數(shù)內(nèi)部做兩個動作:
(1)reduce_outer_joins_pass1采集檢查,就是jointree中帶有外鏈接,以及表的信息,為動作是否參考2個參考資料_1準(zhǔn)備好,重點結(jié)構(gòu)reduce_outer_joins_state;
(2)reduce_outer_joins_pass2真正完成刪除外鏈接。


上一棵樹的內(nèi)存結(jié)構(gòu)(樹結(jié)構(gòu)中目標(biāo)的方法,目標(biāo)的目標(biāo)表存儲結(jié)果的分析結(jié)果,rtable 存儲存儲表的結(jié)果表)表達式樹)

對比reduce_outer_joins運行前后查詢樹,jointree和rtable中的jointype都由join_left轉(zhuǎn)換為join_inner,即外連接已轉(zhuǎn)為內(nèi)連接。