執行計劃_explain_analyse

如何產生執行計劃?

預計執行計劃      

explain select a.c_task_mc,b.c_mc from t_task a left join t_task_group b on a.c_task_lx = b.c_id

實際執行計劃    

explain analyse select a.c_task_mc,b.c_mc from t_task a left join t_task_group b on a.c_task_lx = b.c_id

如何閱讀執行計劃?

postgres=# explain analyze select relname,attname from pg_class cl join pg_attribute att on cl.oid = att.attrelid; Hash Join  (cost=1586.32..12238.33 rows=208954 width=128) (actual time=27.980..188.542 rows=211272 loops=1)   Hash Cond: (att.attrelid = cl.oid)   ->  Seq Scan on pg_attribute att  (cost=0.00..5950.54 rows=208954 width=68) (actual time=0.009..57.759 rows=211272 loops=1)   ->  Hash  (cost=1188.92..1188.92 rows=31792 width=68) (actual time=27.932..27.932 rows=31045 loops=1)         Buckets: 4096  Batches: 1  Memory Usage: 3032kB         ->  Seq Scan on pg_class cl  (cost=0.00..1188.92 rows=31792 width=68) (actual time=0.013..13.183 rows=31045 loops=1) Total runtime: 200.296 ms

執行計劃explain

explain select * from t_solution_task_his where c_task_mc = 'DEMO_執行sql工具'

節點解釋

掃描操作

Seq Scan :全表掃描,從表的第一行開始順序掃描,一直掃描到最後滿足查詢條件的記錄

index Scan:索引掃描(讀取索引塊,然後讀取數據文件)

Index Only Scan:索引只讀掃描(只讀取索引文件,根據映射文件獲取數據)

Tid Scan:根據元組頭中的ctid直接定位元祖的位置,讀取數據文件,(page_number, item_number)

Bitmap Index Scan:位圖索引掃描(利用索引,獲得滿足條件選擇的元組的位圖,直接讀取索引文件,不讀取數據)

BitMap Heap Scan:位圖Heap索引掃描(利用Bitmap Index Scan得到的位圖,獲取元組,直接在數據文件中讀取) Function Scan:函數掃描 ,處理範圍表中有函數的情況(PostgreSQL允許函數可以返回元祖集合,類似表的元組集合)

SubQuery:子查詢掃描

Values Scan :Values掃描(Postgresql提供了Values語句格式,允許Values鏈表可以返回元祖集合,類似表的元組集合)

CTE Scan:CTE掃描(select查詢中用了With子句定義子查詢,對With子句的掃描成爲CTE掃描)

WorkTable Scan:工作表掃描(與RecursiveUnion結合共同完成遞歸合併子查詢)

節點解釋

表連接操作

Nested [(type)] Loop:嵌套循環連接。type可能是Inner,left,right,full,semi,anti。inner的可以顯示省略

Merge[(type)] Join 歸併連接。type同上

Hash[(type)] Join:哈希連接。type同上

物化操作 Material :物化操作(緩存子節點的結果,適用於需要多次掃描的節點)

Unique:distinct操作(對下層已經排序節點的輸出去重)

Group:分組操作(Group By 對下層節點的輸出分組)

Sort:排序操作(Order By對下層節點的輸出排序)

Limit:limit/offset操作(從下層節點的輸出中選出一定範圍的元組)

Aggregate:帶有聚集函數的Group By操作

GroupAggregate:分組聚集(帶有分組操作的聚集,需要排序)

HashAggregate:Hash聚集(使用hash算法完成聚集,不需要排序)

WindwoAgg:窗口函數

節點解釋

集合操作 Append:Union,intercect,except操作(多個子查詢的結合操作)

SetOp[type]:intercect/except(需要排序)。type的值可能爲:intersect,intersectAll,except,exceptAll。涉及All的操作需要去重。常以Append爲輸入節點

HashSetOp[type]:intercect/except(用hash算法完成不需要排序)。其他同上 控制類型 Result:一次性結果獲取(如子查詢可以在查詢優化階段獲得結果,多以initplan作爲輸入)

ModifyTable:插入/修改/刪除(inert/update/delete操作的sql) BitmapAnd:多個單獨索引作爲and操作符的左右操作數

BitmapOr:多個索引或一個索引的多個索引列作爲or操作符的左右操作數

recursiveUnion:用於處理遞歸定義的union語句(與workTable Scan配合使用)

過濾器

filter:常規過濾(對元組按條件進行過濾,完成選擇操作)

join filter:連接操作過濾(hashjoin,mergejoin,nestedloop join連接操作情況下使用過濾器)

One-Time:一趟過濾器(對於能一次性獲得結果的Result操作,一趟過濾即可滿足過濾要求)

節點解釋

連接條件

Hash cond:顯示hash連接的條件

merge cond:顯示merge連接的條件

其他類型

Foreign Scan:外部表(對外部對象的訪問)

LockRows:查詢中帶有For update/For share的操作,需要對被操作對象加鎖

Remote SQL:配合Foreign Scan表示遠程的sql

InitPlan:與Result配合,在初始化查詢計劃的階段即可完成的操作

Rechck Cond:對條件重新進行檢查 Output:表示輸出信息

啓動時間

 

 

 

 

 

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