PostgreSQLDBA(13)-自頂往下的方法閱讀執行計劃

一般來說,閱讀執行計劃通常采用自底往上的方法,這好比從樹的某片葉子出發然后再到樹枝再到樹干、樹根這么一種方法來了解一顆樹,這種方法存在的問題是如果這顆樹很大,那么就可能出現“只見葉子不見樹干”難以把握整體的情況。這時候可以結合自頂往下的方法進行閱讀,從而在整體把握整個執行計劃。

成都創新互聯是一家專業的成都網站建設公司,我們專注網站建設、成都網站建設、網絡營銷、企業網站建設,賣友情鏈接廣告投放為企業客戶提供一站式建站解決方案,能帶給客戶新的互聯網理念。從網站結構的規劃UI設計到用戶體驗提高,創新互聯力求做到盡善盡美。

一、基礎知識

為了更好的理解和使用自頂往下的閱讀方法,需要預先掌握一些基礎知識.
計劃節點類型

在PostgreSQL中,計劃節點分為四類,分別是控制節點(Control Node)、掃描節點(ScanNode),物化節點(Materialization Node)、連接節點(Join Node) 。
1.控制節點:是一類用于處理特殊情況的節點,用于實現特殊的執行流程。例如,Result節點可用來表示INSERT語句中VALUES子句指定的將要插人的元組。
2.掃描節點:此類節點用于掃描表等對象以從中獲取元組。例如,SeqScan節點用于順序掃描一個表.毎次掃描一個元組。
3.物化節點:這類節點種類比較復雜,但它們有一個共同特點,即能夠緩存執行結果到輔助存儲中。物化節點會在第一次被執行時生成其中的所有結果元組,然后將這些結果元組緩存起來,等待其上層節點取用;而非物化節點則是每次被執行時生成一個結果元組并返回給上層節點。例如,Sort節點能夠獲取下層節點返回的所有元組并根據指定的屬性進行排序,并將排序結果全部緩存起來,每次上層節點從Sort節點取元組時就從緩存中按順序返回下一個元組。
4.連接節點:此類節點對應于關系代數中的連接操作,可以實現多種連接方式(條件連接、左連接、右連接、全連接、自然連接等),每種節點實現一種連接算法。例如,HashJoin實現了基于Hash的連接箅法。

為了方便起見,在此基礎上進行推廣,設置規則:如控制節點/物化節點的子節點為連接節點,則視為連接節點,否則視為非連接節點.
根據這條規則,可以把所有的節點分為兩類,即連接節點非連接節點.

二、自頂往下的方法

自頂往下的方法,顧名思義,從執行計劃的最頂端/最外層進行閱讀.
1.識別節點類型(非連接節點 vs 連接節點)
2.如為非連接節點,則識別該節點的具體類型(數據表掃描...),該分支結束
3.如為連接節點,則識別連接的outer端和inner端
3.1 對outer端遞歸應用1/2/3步驟
3.2 對inner端遞歸應用1/2/3步驟

下面舉例說明,SQL腳本如下:

testdb=# explain verbose select dw.*,grjf.grbh,grjf.xm,grjf.ny,grjf.je 
testdb-# from t_dwxx dw,lateral (select gr.grbh,gr.xm,jf.ny,jf.je 
testdb(#                         from t_grxx gr inner join t_jfxx jf 
testdb(#                                        on gr.dwbh = dw.dwbh 
testdb(#                                           and gr.grbh = jf.grbh) grjf
testdb-# where dw.dwbh in ('1001','1002')
testdb-# order by dw.dwbh;
                                              QUERY PLAN                                               
-------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=0.87..61.01 rows=20 width=47)
   Output: dw.dwmc, dw.dwbh, dw.dwdz, gr.grbh, gr.xm, jf.ny, jf.je
   ->  Nested Loop  (cost=0.58..53.88 rows=20 width=32)
         Output: dw.dwmc, dw.dwbh, dw.dwdz, gr.grbh, gr.xm
         ->  Index Scan using t_dwxx_pkey on public.t_dwxx dw  (cost=0.29..13.92 rows=2 width=20)
               Output: dw.dwmc, dw.dwbh, dw.dwdz
               Index Cond: ((dw.dwbh)::text = ANY ('{1001,1002}'::text[]))
         ->  Index Scan using idx_t_grxx_dwbh on public.t_grxx gr  (cost=0.29..19.88 rows=10 width=16)
               Output: gr.dwbh, gr.grbh, gr.xm, gr.xb, gr.nl
               Index Cond: ((gr.dwbh)::text = (dw.dwbh)::text)
   ->  Index Scan using idx_t_jfxx_grbh on public.t_jfxx jf  (cost=0.29..0.35 rows=1 width=20)
         Output: jf.grbh, jf.ny, jf.je
         Index Cond: ((jf.grbh)::text = (gr.grbh)::text)
(13 rows)

1.識別節點類型: Nested Loop -> 連接節點
3.連接節點:識別outer端,即通常所說的驅動表(這里是Nested Loop)和inner端(Index Scan).
3.1 outer端為連接節點,類型為Nested Loop
遞歸應用1/2/3步驟,解析該Nested Loop
3.1.1 outer端為Index Scan on t_dwxx
3.1.2 inner端為Index Scan on t_grxx
3.2 inner端,遞歸應用1/2/3步驟,即Index Scan on t_jfxx

采用自頂往下的方法,可以從"大局"上對執行計劃上進行把握,避免一開始就進入繁雜的細節之中.

三、參考資料

PgSQL · 最佳實踐 · EXPLAIN 使用淺析
跟我一起讀postgresql源碼(九)

文章題目:PostgreSQLDBA(13)-自頂往下的方法閱讀執行計劃
網站地址:http://m.kartarina.com/article42/jedjec.html

成都網站建設公司_創新互聯,為您提供Google電子商務自適應網站ChatGPTApp開發關鍵詞優化

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

h5響應式網站建設
主站蜘蛛池模板: 无码精品人妻一区二区三区免费看| 无码无套少妇毛多18PXXXX| 日韩av无码中文字幕| 亚洲av无码成h人动漫无遮挡| 亚洲国产精品无码久久久蜜芽| 亚洲av无码专区在线| 亚洲Av无码乱码在线观看性色 | 免费播放美女一级毛片 | 超清无码无卡中文字幕| 久久男人Av资源网站无码软件| 国产成人无码a区在线观看视频免费 | 99无码精品二区在线视频| 色欲aⅴ亚洲情无码AV| 亚洲av无码专区国产乱码在线观看 | 中文字幕无码不卡在线| 亚洲最大中文字幕无码网站| 国产综合无码一区二区辣椒| 亚洲精品无码高潮喷水A片软| 久久中文精品无码中文字幕| 亚洲AV无码一区二区三区网址| 亚洲AV无码专区在线播放中文| 亚洲人成人无码网www国产| 日韩AV无码精品人妻系列| 国产精品毛片无码| 国产精品无码久久av不卡| 亚洲熟妇无码一区二区三区导航| 13小箩利洗澡无码视频网站免费| 69成人免费视频无码专区| 中日韩精品无码一区二区三区| 久久精品无码一区二区三区| 无码专区国产无套粉嫩白浆内射| (无码视频)在线观看| 亚洲中文字幕无码中文| 无码av人妻一区二区三区四区| 人妻无码中文久久久久专区| 国产AV无码专区亚洲AVJULIA| 伊人久久无码中文字幕| 久久久久亚洲av成人无码电影| 国产精品va在线观看无码| 久久综合一区二区无码| 无码激情做a爰片毛片AV片|