GaussDB T 性能調優——SQL問題分析之解讀執行計劃

墨天輪原文鏈接:https://www.modb.pro/db/22223

摘要:本文介紹GaussDB T 數據庫SQL 問題分析之解讀執行計劃。

解讀執行計劃

查看執行計劃
GaussDB T默認開啓RBO,開啓和關閉CBO需要執行SQL語句。

--開啓CBO
ALTER SYSTEM SET CBO = ON; 
--關閉CBO
ALTER SYSTEM SET CBO = OFF;

使用explain (plan for) + SQL語句打印執行計劃

image.png

對於上述執行計劃的每一列的含義說明:

● Id:行號。
● Description:執行計劃具體信息包括:表的掃描方式,索引的選擇,多表的連接方式,過濾條件等。
● Owner:表所在的用戶。
● Name:表或者索引的名稱。
● Rows:CBO預估的行數。
● Cost:CBO用於選擇執行計劃的代價。
對於執行計劃下方顯示的謂詞信息(Predicate Information):
通過執行計劃的行號(Id)對應
● access:兩表之間的關聯條件
● fiÃìr:表的過濾條件

與表相關的執行計劃

● 全表掃描(table access full)

在GaussDB T中使用TABLE ACCESS FULL表示對cbo_ef_data_1w_s走全表掃描
image.png

● 僅通過索引的表掃描(table access by index only)
GaussDB T在執行計劃中使用TABLE ACCESS BY INDEX ONLY表示對錶cbo_ef_data_1w_s僅走索引掃描

image.png

● 通過rowid回表的表掃描方式(table access by index rowid)
GaussDB T在執行計劃中使用TABLE ACCESS BY INDEX ROWID表示對錶 cbo_ef_data_1w_s走ROWID掃描

image.png

與索引相關的掃描方式

● 索引唯一掃描(index unique scan)
GaussDB T在執行計劃中使用INDEX UNIQUE SCAN表示對錶cbo_ef_data_1w_s 中的索引pk_cbo_ef_data_1w_s走索引唯一掃描。

image.png

● 索引範圍掃描(index range scan)
GaussDB T在執行計劃中使用INDEX RANGE SCAN表示對錶cbo_ef_data_1w_s中的索引pk_cbo_ef_data_1w_s走索引範圍掃描。

image.png

● 索引全掃描(index full scan)
GaussDB T在執行計劃中使用INDEX FULL SCAN表示對錶cbo_ef_data_1w_s中的索引ef1w_s_intf0_idx走索引全掃描。

image.png

● 索引快速全掃描(index fast full scan)
GaussDB T在執行計劃中使用INDEX FAST FULL SCAN表示對錶
cbo_ef_data_1w_s中的索引pk_cbo_ef_data_1w_s走索引快速全掃描

image.png

● 分佈式掃描(remote scan)
分佈式執行計劃中,REMOTE SCAN表示將SQL語句下推到DN上執行。

explain select * from t1;
EXPLAIN PLAN OUTPUT 
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Description | Owner | Name | Rows | Cost | Bytes | Remark |
---------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | | | |
| 1 | REMOTE SCAN | | | | | | PUSHDOWN SQL: SELECT AA,BB FROM 
SHARDING_REGRESS.T1 |
---------------------------------------------------------------------------------------------------------------------

與表連接的執行計劃

● NESTED LOOPS
– NESTED LOOPS(嵌套循環連接)
下列執行計劃顯示,表S和表T走的是嵌套循環連接,連接條件爲
s.int_f0=t.int_f0,這裏嵌套循環連接的驅動表是表S,嵌套循環連接的在執行
計劃中使用NESTED LOOPS表示。

image.png

– NESTED LOOPS OUTER(嵌套循環外連接)
下列執行計劃顯示,表S和表T走的是嵌套循環外連接,連接條件爲
s.int_f0=t.int_f0,這裏嵌套循環連接的驅動表是表S,外連接在執行計劃中使用OUTER
表示,嵌套循環外連接的在執行計劃中使用NESTED LOOPSOUTER表示。

image.png

– NESTED LOOPS FULL(嵌套循環全連接)
上述執行計劃顯示,表S和表T走的是嵌套循環全連接,連接條件爲
s.int_f0=t.int_f0,這裏嵌套循環全連接的驅動表是表S,全連接在執行計劃中使用FULL
表示,嵌套循環全連接的在執行計劃中使用NESTED LOOPS FULL表示。

image.png

● HASH JOIN(哈希連接)
哈希連接在執行計劃中用HASH JOIN表示,並且後面的(L OR R)表示左表還是右表建立
HASH表。
– 左表建立HASH
下列執行計劃顯示,表S和表T走的是哈希連接,並且建立哈希表的是表S,連接的條件是
s.int_f0=t.int_f0。

image.png

– 右表建立HASH
下列執行計劃顯示,表S和表T走的是哈希連接,並且建立哈希表的是表S,連接的條件是
s.int_f5 =t.int_f5。

image.png

– HASH JOIN OUTER(哈希外連接)
下列執行計劃顯示,表S和表T走的是哈希外連接,並且建立哈希表的是表T,連接的條件是
s.int_f0 =t.int_f0。哈希外連接在執行計劃中用HASH JOIN OUTER表示,並且後面的
(L OR R)表示左表還是右表建立hash表。

image.png

– HASH JOIN SIMI(哈希半連接)
下列執行計劃顯示,表t1和表t2走的是哈希半連接,並且建立哈希表的是表t2,連接的條件是t1.int_f0 =t2.int_f0。半連接在執行計劃中使用SIMI表示,哈希半連接在執行計劃中用HASH JOIN SIMI表示,並且後面的(L OR R)表示左表還是右表建立hash表。

image.png

– HASH JOIN ANTI(哈希反連接)
下列執行計劃顯示,表t1和表t2走的是哈希反連接,並且建立哈希表的是表t2,連接的條件是t1.int_f0 =int_f0。反連接在執行計劃中使用ANTI表示,哈希反連接在執行計劃中使用HASH JOIN ANTI表示,並且後面的(L OR R)表示左表還是右表建立hash表。

image.png

– HASH JOIN FULL(哈希全連接)
下列執行計劃顯示,表s和表t走的是哈希全連接,並且建立哈希表的是表s,連接的條件是s.int_f0 =t.int_f0。全連接在執行計劃中使用FULL表示,哈希全連接在執行計劃中使用HASH JOIN FULL表示,並且後面的(L OR R)表示左表還是右表建立hash表。

image.png

● MERGE JOIN(排序合併連接)
下列執行計劃顯示,表S和表T走的是排序合併連接,連接條件爲t1.a > t2.a,排序
合併連接的關鍵字是MERGE JOIN。

image.png

其他常見的執行計劃

● SUBSELECT(子查詢)
下列執行計劃顯示,表t3在一個子查詢裏面,表t1和這個子查詢走哈希半連接,這個子查詢作爲一個整體來執行。執行計劃中使用SUBSELECT表示子查詢。

image.png

● VIEW(視圖)
根據能否直接處理視圖中的基礎表分爲兩種情況:
– 能夠直接處理視圖中的基礎表,此時執行計劃中可能不會顯示關鍵字VIEW。

image.png

– 不能直接處理視圖,此時將視圖看做一個整體單獨執行,此時在執行計劃中就會顯示關鍵字VIEW。

image.png

● FILTER
下列執行計劃表示:首先fiÃìr會得到它下層的結果集,之後根據過濾條件去除不滿足條件的數據,最終得到一個返回上層的結果集。

image.png

● 分組
– AGGR
下列執行計劃表示:首先求出cbo_ef_data_1w_s滿足條件的記錄,之後對這些記錄進行聚集函數求值。執行計劃中使用AGGR表示將整個結果集作爲一組。

image.png

– HASH GROUP BY(哈希分組)
上述執行計劃表示:通過使用建立hash表的方式進行分組,之後求聚集函數sum的值。執行計劃使用HASH GROUP BY表示進行哈希分組

image.png

– INDEX GROUP BY(索引分組)
上述執行計劃表示:通過使用索引的方式進行分組,之後求聚集函數sum的值。執行計劃使用INDEX GROUP BY表示進行索引分組。

image.png

– HAVING(過濾)
上述執行計劃表示:通過使用建立hash表的方式進行分組,之後利用having條件過濾結果,並將結果返回到上一層。執行計劃中使用HAVING表示分組的過濾。

image.png

● 去重
– HASH DISTINCT(哈希去重)
上述執行計劃表示:通過使用建立hash表的方式進行去重。執行計劃使用HASH DISTINCT表示哈希去重。

image.png

– INDEX DISTINCT(索引去重)
上述執行計劃表示:通過使用索引的方式進行去重。執行計劃使用INDEX DISTINCT表示索引去重。

image.png

● 層級查詢
下列執行計劃表示:在層級查詢中第一層走表s和表t的嵌套查詢,並且表s走索引
pk_cbo_ef_data_1w_s的唯一掃描,表t走索引ef1w_s_intf0_idx的範圍掃描;層級查詢的其他層走表s和表t的嵌套查詢,並且兩表走全表掃描。執行計劃中使用 START WITH表示第一層,CONNECT BY表示其它層。

image.png

● 排序
– 普通排序(QUERY SORT ORDER BY)
下列SQL語句只需要單純的排序,執行計劃中使用QUERY SORT ORDER BY 表示排序。

image.png

– SORT GROUP BY(分組排序)
下列SQL語句既要排序,也需要要分組,在執行計劃中使用SORT GROUP BY 表示既要分組,也要排序。

image.png

– SORT DISTINCT(排序去重)
下列SQL語句既要排序,還要去重。行計劃中使用SORT DISTINCT表示既要排序,還要去重。

image.png

– QUERY SORT SIBLINGS ORDER BY(兄弟節點之間的排序)
下列SQL語句表示對層級查詢之後的結果進行兄弟節點之間的排序,必須與 CONNECT BY一起使用。執行計劃中使用QUERY SORT SIBLINGS ORDER BY 表示兄弟節點之間的排序。

image.png

● UNION/UNION ALL
下列執行計劃表示:表t1和表t2走索引快速全掃描之後的結果進行union。得到結果後再與t3表進行union all。執行計劃中使用UNION ALL表示UNION ALL,使用 HASH UNION表示UNION。

image.png

● CONCATENATION(OR擴展)
下列執行計劃表示:對錶t1和表t2走索引掃描之後的結果進行or擴展。執行計劃中使用CONCATENATION表示OR擴展。

image.png

● PIVOT/UNPIVOT
– PIVOT(行轉列)
下列執行計劃表示:dummy和t_for_pivot_1關聯之後的結果進行哈希行轉列。執行計劃中使用PIVOT表示行轉列。

image.png

– UNPIVOT(列轉行)
下列執行計劃表示,表for_unpivot_1的結果進行列轉行。執行計劃中使用 UNPIVOT表示列轉行。

image.png

● FOR UPDATE
下列執行計劃表示:對於下層即cbo_ef_data_1w_s全表掃描得到的結果進行加鎖,並將結果返回到上一層。執行計劃中使用FOR UPDATE表示對下層數據進行加鎖。

image.png

● LIMIT/ROWNUM
– QUERY LIMIT
下列執行計劃顯示:下層即cbo_ef_data_1w_s全表掃描得到的結果只取前面10條記錄。執行計劃使用QUERY LIMIT表示限制輸出多少條。

image.png

– SELECT LIMIT
上述執行計劃顯示:下層即union all得到的結果只取前面10條記錄。執行計劃使用SELECT LIMIT表示限制輸出多少條。

image.png

● ROWNUM FILTER
下列執行計劃顯示:下層即cbo_ef_data_1w_s全表掃描得到的結果,使用id >100過濾數據,並只取滿足條件的前9條記錄。

image.png

● ROWNUM COUNT
下列執行計劃顯示:下層即cbo_ef_data_1w_s索引掃描得到的記錄數。執行計劃使用ROWNUM COUNT記錄下層結果集個數。

image.png

● WINSORT
下列執行計劃顯示:對錶求max窗口函數的值。執行計劃使用WINSORT表示窗口函數。

image.png

數據庫,gaussdb

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章