天天看點

sql查詢父節點所有子節點id_Greenplum查詢優化揭秘Greenplum查詢優化揭秘學習位址:https://space.bilibili.com/489184136目錄1 Greenplum查詢優化器和查詢計劃介紹2 Greenplum查詢優化器的的具體處理過程

Greenplum查詢優化揭秘學習位址:https://space.bilibili.com/489184136目錄

Greenplum查詢優化揭秘

目錄

1 Greenplum查詢優化器和查詢計劃介紹

1.1 Greenplum查詢優化器介紹

1.2 Greenplum查詢計劃介紹

1.3 計劃節點的類型

2 Greenplum查詢優化器的的具體處理過程

2.1 查詢樹的預處理

2.1.1 查詢樹的預處理(早期)

2.1.2 查詢樹的預處理(後期)

2.2 掃描/連結優化

2.3 動态規劃

2.4 掃描/連接配接之外的優化

2.5 計劃樹的後處理

1 Greenplum查詢優化器和查詢計劃介紹

1.1 Greenplum查詢優化器介紹

對于給定的查詢語句,找到”代價”最小的查詢計劃的順序

1、對于同一個查詢語句,一般可以由多種方式執行

2、查詢優化器盡可能去周遊每一種可能的執行方式

3、找到”代價”最小的執行方式,并把它轉化為可執行的計劃樹

1.2 Greenplum查詢計劃介紹

1、一個查詢計劃就是一個由計劃節點組成的樹

2、每個計劃節點代表了一個特定類型的處理操作,計劃節點中包含了執行器執行所需要的全部資訊

3、在執行時,計劃節點産生輸出元組

4、一般來說,掃描節點從資料表中擷取輸入元組

5、大部分其他節點層他們的子計劃節點中擷取輸入元組,并産生輸出元祖

1.3 計劃節點的類型

1、掃描節點

順序掃描,索引掃描,位圖掃描

2、連結節點

Nestloop,hash,merge

3、非SPJ節點

Sort,aggregate,set operations(UNION etc)

掃描節點執行個體

sql查詢父節點所有子節點id_Greenplum查詢優化揭秘Greenplum查詢優化揭秘學習位址:https://space.bilibili.com/489184136目錄1 Greenplum查詢優化器和查詢計劃介紹2 Greenplum查詢優化器的的具體處理過程

2 Greenplum查詢優化器的的具體處理過程

2.1 查詢樹的預處理

盡可能的簡化查詢樹,收集有用的資訊

2.1.1 查詢樹的預處理(早期)

2.1.1.1 簡化常量表達式

1、簡化函數表達式

函數本身是”嚴格”的,并且輸入包含NULL值,示例如下

Int4eq(1,NULL) => NULL

函數本身是”IMMUTABLE”的,并且輸入參數全都常量

2 + 2  =>  4

2、簡化常量表達式

簡化布爾表達式

“x or true” => “true”

“ x AND false ” => “false”

3、簡化CASE表達式

CASE WHEN 2+2 = 4 THEN  x+1

ELSE 1/0 END

= > x + 1

... not “ERROR:division by zero”

4、為什麼簡化常量表達式

A、僅需要做一次計算,而不是為每行元組都做一次計算

B、視圖展開和函數内連都可能會帶來新的常量表達式簡化的機會

C、簡化常量表達式也為統計資訊類的函數減少了計算量

2.1.1.2内連簡單的SQL函數

create function incr4(int) returns  int as ‘select $1 + (  2 + 2 ) ’ LANGUAGE SQL;

select incr4(a) from foo;

== >

Select a + 4 from foo;

為什麼使用内聯簡單的SQL函數

1、避免SQL函數調用的代價

2、為簡化常量表達式提供新的機會

2.1.1.3 提升IN,EXISTS類型的子連結

子連結是指吃現在表達式中的子查詢,通常出現在where或join/on子句中

select  *  from  foo  where exists (select 1 from bar where foo.a = bar.c);

== >

Select * from foo  *SEMI  JOIN*  bar on foo.a = bar.c

查詢樹的内部結構圖

sql查詢父節點所有子節點id_Greenplum查詢優化揭秘Greenplum查詢優化揭秘學習位址:https://space.bilibili.com/489184136目錄1 Greenplum查詢優化器和查詢計劃介紹2 Greenplum查詢優化器的的具體處理過程

優化後的内部結構圖

sql查詢父節點所有子節點id_Greenplum查詢優化揭秘Greenplum查詢優化揭秘學習位址:https://space.bilibili.com/489184136目錄1 Greenplum查詢優化器和查詢計劃介紹2 Greenplum查詢優化器的的具體處理過程

2.1.1.4 提升子查詢

子查詢一般以範圍表的方式存在,通常出現在from字句中

select  * from foo join (select  bar.c from bar  join baz  on  true) as sub on foo.a = sub.c;

==>

select  *  from  foo join (bar  join baz on  true) on foo.a = bar.c;

提升之前的查詢計劃圖

sql查詢父節點所有子節點id_Greenplum查詢優化揭秘Greenplum查詢優化揭秘學習位址:https://space.bilibili.com/489184136目錄1 Greenplum查詢優化器和查詢計劃介紹2 Greenplum查詢優化器的的具體處理過程

提升之後的子查詢計劃圖

sql查詢父節點所有子節點id_Greenplum查詢優化揭秘Greenplum查詢優化揭秘學習位址:https://space.bilibili.com/489184136目錄1 Greenplum查詢優化器和查詢計劃介紹2 Greenplum查詢優化器的的具體處理過程

為什麼提升子查詢

1、通過把子查詢提升到父查詢之中,就可以使子查詢參與整個計劃搜尋空間,進而找到更好的執行計劃。

2、否則,我們不得不為了子查詢單獨做計劃樹,然後在為父查詢做計劃時把子查詢當做是一個”黑盒子”

2.1.1.5消除外連結

消除外連結的執行個體

sql查詢父節點所有子節點id_Greenplum查詢優化揭秘Greenplum查詢優化揭秘學習位址:https://space.bilibili.com/489184136目錄1 Greenplum查詢優化器和查詢計劃介紹2 Greenplum查詢優化器的的具體處理過程

外連結的上層有”嚴格”的限制條件,且該條件限定了來自nullable side的某一變量為非null值,則外連結可以轉化成内連接配接

select ... from foo left join bar on (...) where bar.d = 42;

==>

select ... from foo inner join bar on (...) where bar.d = 42;

2.1.2 查詢樹的預處理(後期)

2.1.2.1 分發where和join/on限制條件

1、一般來說,我們期望可以盡可能的下推限制條件

2、如果隻有内連接配接,我們可以把一個限制條件下推到它的”自然語義”位置

3、如果存在外連結,那麼限制條件的下推可能會受到阻礙,進而無法下載下傳到它的“自然語義”的位置

4、對于被外連接配接阻礙的限制條件,我們通過讓他們的“required_relids”包含進外連結鎖需要的所有基表,進而避免該限制條件被下推到外連結之下

被外連結阻礙的限制條件案例

sql查詢父節點所有子節點id_Greenplum查詢優化揭秘Greenplum查詢優化揭秘學習位址:https://space.bilibili.com/489184136目錄1 Greenplum查詢優化器和查詢計劃介紹2 Greenplum查詢優化器的的具體處理過程
sql查詢父節點所有子節點id_Greenplum查詢優化揭秘Greenplum查詢優化揭秘學習位址:https://space.bilibili.com/489184136目錄1 Greenplum查詢優化器和查詢計劃介紹2 Greenplum查詢優化器的的具體處理過程

2.1.2.2 收集關于連結順序限制的資訊

1、外連結會在一定程度上限制連接配接順序的交換

2、非FULL-JOIN可以和一個外連結的左端(LHS)自由結合

3、通常非FULL-JOIN不可以和外連結的有段(RHS)結合

sql查詢父節點所有子節點id_Greenplum查詢優化揭秘Greenplum查詢優化揭秘學習位址:https://space.bilibili.com/489184136目錄1 Greenplum查詢優化器和查詢計劃介紹2 Greenplum查詢優化器的的具體處理過程

2.1.2.3 消除無用連結

1、必須是做連結,且内表是基表

2、内表的列沒有在該連接配接之上上使用

3、連接配接條件最多隻可能比對内表中的一個元組

消除無用連結執行個體

sql查詢父節點所有子節點id_Greenplum查詢優化揭秘Greenplum查詢優化揭秘學習位址:https://space.bilibili.com/489184136目錄1 Greenplum查詢優化器和查詢計劃介紹2 Greenplum查詢優化器的的具體處理過程

2.2 掃描/連結優化

為查詢語句中掃描和連結部分做計劃,執行個體如下:

sql查詢父節點所有子節點id_Greenplum查詢優化揭秘Greenplum查詢優化揭秘學習位址:https://space.bilibili.com/489184136目錄1 Greenplum查詢優化器和查詢計劃介紹2 Greenplum查詢優化器的的具體處理過程

1、首先為基表确定掃描路徑,估計掃描路徑的代價和大小

2、利用動态規劃算法,搜尋整個連結順序空間,生成連結路徑

3、在搜尋連結順序空間是,需要考慮到由外連結帶來的連結順序的限制

2.3 動态規劃

1、為每一個基表生成掃描路徑

2、為所有可能的兩個表的連結生成連結路徑

3、為所有可能的三個表的連結生成連結路徑

4、為所有可能的四個表的連結生成連結路徑

*****

5、直到所有基表都連接配接在了一起

2.4 掃描/連接配接之外的優化

為查詢語句中掃描和連結之外的部分做計劃,掃描/連接配接之外的優化的步驟如下:

1、首先為表确定掃描路徑,估計掃描路徑的代價和大小

2、利用動态規劃算法,搜尋整個連結順序空間,生成連結路徑

3、在搜尋連結順序空間時,需要考慮到由外連結帶來的連結順序的限制

4、處理GROUP BY ,aggregation,windom,functions,DISTINCT

5、處理集合操作,UNION/INTERSECT/EXCEPT

6、如果ORDER BY需要,添加最後的SORT節點

7、添加LockRows,Limit,ModifyTable節點

sql查詢父節點所有子節點id_Greenplum查詢優化揭秘Greenplum查詢優化揭秘學習位址:https://space.bilibili.com/489184136目錄1 Greenplum查詢優化器和查詢計劃介紹2 Greenplum查詢優化器的的具體處理過程

1、主要處理查詢語句中FROM和WHERE部分

2、同時也會考慮到ORDER BY資訊

3、有代價來驅動

2.5 計劃樹的後處理

把優化結果轉化成執行器可以執行的形式

1、把代價最小的路徑轉化成計劃樹

2、調整計劃樹中的一些細節,包含以下步驟

1)、展平子查詢的範圍表

2)把上層計劃節點中的變量變成OUTER_VAR或時INNER_VAR的形式,來指向自己花的輸出

3)删除不必要的SubqueryScan,Append等節點