如何產生執行計劃?
預計執行計劃
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:表示輸出信息
啓動時間