中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-11 18:57:17 來源:ITPUB博客 閱讀:160 作者:husthxd 欄目:關系型數據庫

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

一、基礎知識

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

在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源碼(九)

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

卓尼县| 岳阳县| 许昌县| 丹阳市| 洱源县| 祁东县| 富裕县| 曲周县| 文山县| 慈溪市| 措勤县| 平谷区| 丰都县| 高清| 湘阴县| 南华县| 内乡县| 新闻| 霸州市| 赤城县| 江西省| 清新县| 永德县| 陕西省| 天柱县| 临潭县| 康马县| 平安县| 腾冲县| 远安县| 灌云县| 安庆市| 昌江| 荆州市| 龙南县| 娄底市| 宁化县| 巴林右旗| 青龙| 濉溪县| 新和县|