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)
掃描節點執行個體

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
查詢樹的内部結構圖
優化後的内部結構圖
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;
提升之前的查詢計劃圖
提升之後的子查詢計劃圖
為什麼提升子查詢
1、通過把子查詢提升到父查詢之中,就可以使子查詢參與整個計劃搜尋空間,進而找到更好的執行計劃。
2、否則,我們不得不為了子查詢單獨做計劃樹,然後在為父查詢做計劃時把子查詢當做是一個”黑盒子”
2.1.1.5消除外連結
消除外連結的執行個體
外連結的上層有”嚴格”的限制條件,且該條件限定了來自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”包含進外連結鎖需要的所有基表,進而避免該限制條件被下推到外連結之下
被外連結阻礙的限制條件案例
2.1.2.2 收集關于連結順序限制的資訊
1、外連結會在一定程度上限制連接配接順序的交換
2、非FULL-JOIN可以和一個外連結的左端(LHS)自由結合
3、通常非FULL-JOIN不可以和外連結的有段(RHS)結合
2.1.2.3 消除無用連結
1、必須是做連結,且内表是基表
2、内表的列沒有在該連接配接之上上使用
3、連接配接條件最多隻可能比對内表中的一個元組
消除無用連結執行個體
2.2 掃描/連結優化
為查詢語句中掃描和連結部分做計劃,執行個體如下:
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節點
1、主要處理查詢語句中FROM和WHERE部分
2、同時也會考慮到ORDER BY資訊
3、有代價來驅動
2.5 計劃樹的後處理
把優化結果轉化成執行器可以執行的形式
1、把代價最小的路徑轉化成計劃樹
2、調整計劃樹中的一些細節,包含以下步驟
1)、展平子查詢的範圍表
2)把上層計劃節點中的變量變成OUTER_VAR或時INNER_VAR的形式,來指向自己花的輸出
3)删除不必要的SubqueryScan,Append等節點