久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何理解GaussDB explain分布式執行計劃

158次閱讀
沒有評論

共計 4247 個字符,預計需要花費 11 分鐘才能閱讀完成。

如何理解 GaussDB explain 分布式執行計劃,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

前言

執行計劃 (又稱解釋計劃) 是數據庫執行 SQL 語句的具體步驟,例如通過索引還是全表掃描訪問表中的數據,連接查詢的實現方式和連接的順序等。如果 SQL 語句性能不夠理想,我們首先應該查看它的執行計劃。本文主要介紹如何詳細解讀 GaussDB(DWS)產生的分布式執行計劃,從計劃中發現性能調優點。

1、執行算子介紹

要讀懂執行計劃,首先要知道數據庫執行算子的概念:

如何理解 GaussDB explain 分布式執行計劃

下面重點介紹下基于 sharing nothing 的分布式計劃中最重要的一類算子——STREAM 算子

三種類型的 stream 算子

1) Gather Stream (N:1) – 每個源結點都將其數據發送給目標結點

如何理解 GaussDB explain 分布式執行計劃

2) Redistribute Stream (N:N) – 每個源節點將其數據根據連接條件計算 Hash 值,根據重新計算的 Hash 值進行分布,發給對應的目標節點

如何理解 GaussDB explain 分布式執行計劃

3) Broadcast Stream (1:N) – 由一個源節點將其數據發給 N 個目標節點

如何理解 GaussDB explain 分布式執行計劃

其中 1)主要用于 CN 與 DN 間的數據交換,2)與 3)主要用于 DN 間的數據交換

2、EXPLAIN 用法

SQL 執行計劃是一個節點數,顯示執一條 SQL 語句執行時的詳細步驟。每一個步驟是一個數據庫運算符,也叫作一個執行算子。使用 explain 命令可以查看優化器為每個查詢生成的具體執行計劃。

1) EXPLAIN 的語法

如何理解 GaussDB explain 分布式執行計劃

其中,option 中 COSTS 與 NODES 的默認值為 ON,其他參數默認為 OFF。

說明:

a) EXPLAIN + QUERY 并不會真正執行,只會將計劃打印出來,指定 option 中的 ANALYZE 可以進行實際執行

b) PERFORMANCE 選項默認會將所有的選項置為 ON,即顯示所有的執行信息。

c) CPU/BUFFER/DETAIL 選項依賴于 ANALYZE,只有 ANALYZE 置為 ON 的時候,才能使用這幾個選項。

d) DETAIL 選項用來控制輸出,DETAIL 置為 ON 時,會顯示各個 DN 上具體的執行信息;DATAIL 置為 OFF 時,顯示所有 DN 的匯總信息,即最大最小值信息。

如何理解 GaussDB explain 分布式執行計劃

2) EXPLAIN 顯示格式

GaussDB 中提供了兩種顯示格式(normal/pretty),通過設置參數 explain_perf_mode 進行控制。其中,normal 格式為默認的顯示格式。

normal 格式如下:

如何理解 GaussDB explain 分布式執行計劃

pretty 格式如下:

如何理解 GaussDB explain 分布式執行計劃

改進后的顯示格式,層次清晰,計劃包含了 plan node id,性能分析會更加簡單直接。

使用之前可以使用 show explain_perf_mode; 來查看當前數據庫使用的顯示風格。

同時可以使用 set explain_perf_mode=pretty/normal; 來設置輸出的格式。

3、示例計劃解讀(每個算子資源消耗、耗時等等)

1)四中常見類型計劃

建表語句:

如何理解 GaussDB explain 分布式執行計劃

a) FQS 計劃,完全下推,下發 query

如何理解 GaussDB explain 分布式執行計劃

兩表 JOIN,且其連接條件為各表的分布列,在關閉 stream 算子的情況下,CN 會直接將該語句發送至各 DN 執行,最后結果在 CN 匯總。

b) 非 FQS 計劃,部分語句下推

如何理解 GaussDB explain 分布式執行計劃

兩表 JOIN,且連接條件中包含非分布列,此時在關閉 stream 算子的情況下,CN 會將基表掃描語句下發至各 DN,然后在 CN 上進行 JOIN。

c) Stream 計劃,DN 之間無數據交換

如何理解 GaussDB explain 分布式執行計劃

兩表 JOIN,且連接條件為各表的分布列,因此各 DN 無需數據交換。CN 生成 stream 計劃后,將除 Gather Stream 的計劃下發給 DN 執行,在各個 DN 上進行基表 掃描,并進行哈希連接后,發送給 CN。

d) Stream 計劃,DN 之間存在數據交換

如何理解 GaussDB explain 分布式執行計劃

兩表 JOIN,且連接條件包含非分布列,在開啟 stream 算子的情況下,會生成 stream 計劃,其 DN 間存在數據交換。此時對于 tt02 表,會在各 DN 進行基表掃描,掃描后會通過 Redistribute Stream 算子,按照 JOIN 條件中的 tt02.c1 進行哈希計算后重新發送給各 DN,然后在各 DN 上做 JOIN,最后匯總到 CN。

2) explain performance 詳解

a) 執行計劃

如何理解 GaussDB explain 分布式執行計劃

?id:執行算子節點編號。

?operation:具體的執行節點算子名稱。

?A-time: 各 DN 相應算子執行時間,[]中左側為最小值,右側為最大值,包括下層算子執行時間。

?A-rows:相應算子輸出的全局總行數。

?E-rows:每個算子估算的輸出行數。

?Peak Memory:各 DN 相應算子消耗內存峰值,[]中左側為最小值,右側為最大值。

?E-memory:DN 上每個算子估算的內存使用量,只有 DN 上執行的算子會顯示。某些場景會在估算的內存使用量后使用括號顯示該算子在內存源充足下可以自動擴展的內存上限。

?E-width:每個算子輸出元組的估算寬度。

?E-costs:每個算子估算的執行代價。

b) 謂詞過濾

如何理解 GaussDB explain 分布式執行計劃

顯示對應執行算子節點的過濾條件

c) 內存使用

如何理解 GaussDB explain 分布式執行計劃

主要顯示 CN 的最大內存用量、DN 最大內存用量、各算子的最大內存用量、各算子預估內存用量、Stream 線程的啟動以及收發時間。

d) Targetlist Information

如何理解 GaussDB explain 分布式執行計劃

各個算子對應的輸出目標列信息。

e) DN 信息

如何理解 GaussDB explain 分布式執行計劃

各算子的執行時間、Buffer、CPU 信息

f) 自定義信息

如何理解 GaussDB explain 分布式執行計劃

CN 與 DN 之間的建連信息、DN 與 DN 之間的建連信息。

g) 匯總信息

如何理解 GaussDB explain 分布式執行計劃

DN 執行器開始時間,[min_node_name, max_node_name] : [min_time, max_time]

DN 執行器結束時間,[min_node_name, max_node_name] : [min_time, max_time]

Remote query poll time:接收結果時用于 poll 等待的時間

CN 執行器開始、運行及結束時間

網絡流量,stream 算子發送的數據量

優化器執行期時間

查詢 ID

總執行時間

h) 執行時間介紹

每個算子的執行信息都包含三個部分:

如何理解 GaussDB explain 分布式執行計劃

其中:

dn_6001_6002/dn_6003_6004 表示具體執行的節點信息,括號中的信息是實際的執行信息

actual time=0.013..2290.971 表示實際的執行時間

第一個數字表示執行時進入當前算子到輸出第一條數據所花費的時間

第二個數字為輸出所有數據的總執行時間

注意:在整個計劃中,除了葉子節點的執行時間是算子本身的執行時間,其余算子的執行時間均包含子節點的執行時間。

如何理解 GaussDB explain 分布式執行計劃

在該計劃中,7 號節點和 9 號節點為葉子節點,其余節點均為非葉子簡介。1 號節點時頂層節點,所以該節點的執行時間就可以作為整個查詢的執行時間。

rows=2001550 表示當前算子輸出數據為 2001550 行;

loops=1 表示當前算子的只執行了一次,而對于分區表的掃描(7 號節點)來說:

如何理解 GaussDB explain 分布式執行計劃

該層掃描算子的 loops 為 7,對于分區表,每一個分區表的掃描就是一次完整的掃描操作,當切換到下一個分區的時候,又是一次新的查詢操作,查詢該表定義如下:

如何理解 GaussDB explain 分布式執行計劃

Inventory 表有 7 個分區,所以就執行了 7 次表掃描操作,因此 loops=7。

i) CPU 信息介紹

如何理解 GaussDB explain 分布式執行計劃

每個算子執行的過程都有 CPU 信息,其中 cyc 代表的是 CPU 的周期數,ex cyc 表示的是當前算子的周期數,不包含其子節點;inc cyc 是包含子節點的周期數;ex row 是當前算子輸出的數據行數;ex c/ r 則是 ex cyc/ex row 得到的每條數據所用的平均周期數。

j) Buffer 信息介紹

如何理解 GaussDB explain 分布式執行計劃

buffers 顯示緩沖區信息,包括共享塊和臨時塊的讀和寫。

共享塊包含表和索引,臨時塊在排序和物化中使用的磁盤塊。上層節點顯示出來的塊數據包含了其所有子節點使用的塊數。

Buffers 涉及的參數有兩種,分別為:shared 和 temp,及 shared hit/read/dirtied/written 以及 temp read/write

Hit blocks:代表從磁盤里面讀到的數據塊數

Dirtied blocks:代表當前查詢中被修改了的并且此前未被修改的數據塊數

Written blocks:代表當前線程將 shared bufer 里被修改的數據寫回到磁盤的塊數

k) 執行內存

如何理解 GaussDB explain 分布式執行計劃

其中:

Peak Memory:5KB 表示當前算子實際執行時使用的峰值內存;

Estimate Memory:1024MB 表示預估的內存,為優化器給出的預估值。

l) 其他執行信息

(1)sort 算子,會顯示排序信息

如何理解 GaussDB explain 分布式執行計劃

Sort Method 代表排序的方法,包括 quicksort(快排)和 disksort(外排)。快排即內存夠用時,所有的排序操作均在內存中完成,外排說明當前可用內存不足,需要下盤。

(2)hashjoin 算子

如何理解 GaussDB explain 分布式執行計劃

Buckets:代表 hash 表中實際使用的桶的個數

Batches:代表 hashjoin 中實際分塊的數量。如果 Batches=1,則說明所有的數據全在內存中,沒有下盤操作;反之則說明有下盤操作,Batches – 1 代表臨時文件的個數。

Memory Usage:就是 hashjoin 中內存的使用情況

(3)hashagg 算子

如果發生數據下盤,會有 File Num:512 信息,顯示臨時文件的個數。

(4)stream 算子

如何理解 GaussDB explain 分布式執行計劃

stream 算子的會統計當前算子處理數據的字節數,其從子線程獲取數據的時間(poll time)以及處理數據的時間(Deserialize Time)。

stream 算子的子節點會統計發送端的時間信息,如下:

如何理解 GaussDB explain 分布式執行計劃

發送時間 Send time,排隊時間 Wait Quota time,OS 發送時間以及數據處理的時間。

3) explain 調優示例

一個查詢語句要經過多個算子步驟才會輸出最終的結果。由于個別算子耗時過長導致整體查詢性能下降的情況比較常見。這些算子是整個查詢的瓶頸算子。通用的優化手段是 EXPLAIN ANALYZE/PERFORMANCE 命令查看執行過程的瓶頸算子,然后進行針對性優化。

基表掃描時,對于點查或者范圍掃描等過濾大量數據的查詢,如果使用 SeqScan 全表掃描會比較耗時,可以在條件列上建立索引選擇 IndexScan 進行索引掃描提升掃描效率。如下示例:

如何理解 GaussDB explain 分布式執行計劃

如何理解 GaussDB explain 分布式執行計劃

上述例子中,全表掃描返回 3360 條數據,過濾掉大量數據,在 sssolddate_sk 列上建立索引后,使用 IndexScan 掃描效率顯著提高,從 960 毫秒提升到 8 毫秒。

關于如何理解 GaussDB explain 分布式執行計劃問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注丸趣 TV 行業資訊頻道了解更多相關知識。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-25發表,共計4247字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 周口市| 延庆县| 南乐县| 区。| 新蔡县| 乌海市| 富蕴县| 汶上县| 唐河县| 虞城县| 通州区| 米易县| 江达县| 铁力市| 临潭县| 肇州县| 萨迦县| 缙云县| 湘潭市| 且末县| 阳高县| 方城县| 栾川县| 北川| 酉阳| 广灵县| 新闻| 满洲里市| 云和县| 休宁县| 任丘市| 敦化市| 乌拉特前旗| 大关县| 拜城县| 正宁县| 慈利县| 汶上县| 肃南| 怀远县| 渭源县|