Add optimizer README file.
This commit is contained in:
parent
542d4e528d
commit
d158fce8eb
66
src/backend/optimizer/README
Normal file
66
src/backend/optimizer/README
Normal file
@ -0,0 +1,66 @@
|
||||
Thse directories take the Query structure returned by the parser, and
|
||||
generate a plan used by the executor. The /plan directory generates the
|
||||
plan, the /path generates all possible ways to join the tables, and
|
||||
/prep handles special cases like inheritance. /utils is utility stuff.
|
||||
|
||||
planner()
|
||||
handle inheritance by processing separately
|
||||
-init_query_planner()
|
||||
preprocess target list
|
||||
preprocess qualifications(WHERE)
|
||||
--query_planner()
|
||||
pull out constants from target list
|
||||
get a target list that only contains column names, no expressions
|
||||
if none, then return
|
||||
---subplanner()
|
||||
make list of relations in target
|
||||
make list of relations in where clause
|
||||
find which relations can do merge sort and hash joins
|
||||
----find_paths()
|
||||
find scan and all index paths for each relation not yet joined
|
||||
one relation, return
|
||||
find selectivity of columns used in joins
|
||||
-----find_join_paths()
|
||||
Summary: With OPTIMIZER_DEBUG defined, you see:
|
||||
|
||||
Tables 1, 2, 3, and 4 are joined as:
|
||||
{1 2},{1 3},{1 4},{2 3},{2 4}
|
||||
{1 2 3},{1 2 4},{2 3 4}
|
||||
{1 2 3 4}
|
||||
|
||||
Actual output tests show combinations:
|
||||
{4 2},{3 2},{1 4},{1 3},{1 2}
|
||||
{4 2 3},{1 4 2},{1 3 2}
|
||||
{4 2 3 1}
|
||||
|
||||
Cheapest join order shows:
|
||||
{4 2},{3 2},{1 4},{1 3},{1 2}
|
||||
{3 2 4},{1 4 2},{1 3 2}
|
||||
{1 4 2 3}
|
||||
|
||||
It first finds the best way to join each table to every other
|
||||
table. It then takes those joined table combinations, and joins
|
||||
them to the other joined table combinations, until all tables are
|
||||
joined.
|
||||
|
||||
jump to geqo if needed
|
||||
again:
|
||||
find_join_rels():
|
||||
for each joinrel:
|
||||
find_clause_joins()
|
||||
for each join on joinrel:
|
||||
if a join from the join clause adds only one relation, do the join
|
||||
or find_clauseless_joins()
|
||||
find_all_join_paths()
|
||||
generate paths(nested,mergesort) for joins found in find_join_rels()
|
||||
prune_joinrels()
|
||||
remove from the join list the relation we just added to each join
|
||||
prune_rel_paths()
|
||||
set cheapest and perhaps remove unordered path, recompute table sizes
|
||||
if we have not done all the tables, go to "again"
|
||||
do group(GROUP)
|
||||
do aggregate
|
||||
put back constants
|
||||
re-flatten target list
|
||||
make unique(DISTINCT)
|
||||
make sort(ORDER BY)
|
Loading…
x
Reference in New Issue
Block a user