函式間關係的主要邏輯如下:
planner()
――第(11)層結束,build_join_rel()
}――第(10)層結束,make_join_rel ()
make_rels_by_clause_joins(); //
會呼叫make_join_re
l ()
make_rels_by_clauseless_joins();//
會呼叫make_join_rel()
}――第(9)層結束,join_search_one_level ()
set_cheapest(rel);//
被迴圈呼叫,得到每乙個關係上的花費最低的路徑 }
――第(8)層結束,standard_join_search ()
}――第(7)層結束,make_rel_from_joinlist ()}
――第(6)層結束,make_one_rel()
}――第(5)層結束,query_planner() //返回值是void,但引數中有2個引數(cheapest_path, sorted_path)返回和最優的查詢計畫路徑
optimize_minmax_aggregates();//
對min、max聚集計畫優化
create_plan();//
工具求解得到的最優路徑,建立(初步的)查詢計畫
//新增相應的計畫節點(包括agg、group、distinct、sort、limit),生成完整的查詢計畫 }
――第(4)層結束,grouping_planner()
}――第(3)層結束,subquery_planner()
set_plan_references();//
一些清理輔助工作 }
――第(2)層結束,standard_planner()
}――第(1)層結束,planner()
以上是查詢優化的整體流程,在進入第6層之前是的邏輯查詢計畫生成,如子查詢的消除等邏輯優化策略都是在這個階段之前完成的。
第6層之後是物理查詢計畫生成,利用動態規劃(dynamic programming)的演算法,實現多個關係的訪問方式確定(順序訪問、索引訪問、tid訪問)、連線方式確定(巢狀迴圈連線演算法、歸併連線演算法、hash連線演算法)、連線順序選取(左深樹、右深樹、緊密樹)。
對於連線順序,pg解釋如下(可留心紅色字型標明的決定連線順序的方法的特點):
we considerleft-handed plans(the outer rel of an upper join is a joinrel,
but the
inner is always a single list item
);right-handed plans(
outer rel
is always a single item
); andbushy plans(both inner and outer can be
joins themselves). for example, when building we consider
joining to (left-handed), to (right-handed), and
to (bushy), among other choices.
生成join關係的同時,把可用的生成路徑都新增到每個關係(包括基表和連線生成的表)的pathlist中,每個path除了表示連線的方法,還包含各方面(啟動代價,總的執行代價,含某種順序的代價,unique
的代價等)代價估計的結果。當所有的有用的路徑被新增之後,通過代價的比較,選出代價最小的最佳路徑作為上層選取的貪婪的依據,每層都如此處理,直至頂層時,最佳查詢路徑被選取出來,這是乙個唯一的結果表,至此,基於代價的查詢優化完成。
PostgreSQL的查詢優化
postgresql 的查詢優化 資料庫管理系統中的 sql執行,有多種多樣,從 sql語句型別上講,有 ddl dml dql dcl。不同語句,被資料庫引擎執行,其執行方式 複雜程度都不相同。其中,最為複雜的,是 dql,查詢語句。查詢語句的執行,在資料庫中,又可以分為 2個階段,一是查詢計畫的...
PostgreSQL 查詢優化與維護命令
不同rdbms中提供的不同型別統計功能,查詢優化器和查詢計畫器依賴統計資訊選擇並生成最佳查詢執行計畫,因此它非常重要。postgresql 資料庫也管理不同型別的統計,查詢優化器依賴它們生成最佳查詢執行計畫。假設有一張表有100000行記錄,但表統計資料沒有更新,僅顯示1000個元組資訊。查詢優化器...
記一次postgresql查詢優化
一 場景介紹 1 需求 根據schema 1中多表聯查結果,對相應schema 2中資料進行刪除操作。2 表結構 模式表名 表結構schema 1 table 1 id varchar 32 pk主鍵 table 2 id varchar 32 pk主鍵 table 1 id varchar 32 ...