PostgreSQLはどこでsqlクエリの61を処理します
3982 ワード
Joinの原価計算の呼び出しパス:
make_one_rel
->make_rel_from_joinlist
->standard_join_search
-> join_search_one_level
-> make_join_rel
-> add_paths_to_joinrel
->hash_inner_and_outer
->try_hashjoin_path
->initial_cost_hashjoin
make_join_rel関数には、次のコードがあります.
make_one_rel
->make_rel_from_joinlist
->standard_join_search
-> join_search_one_level
-> make_join_rel
-> add_paths_to_joinrel
->hash_inner_and_outer
->try_hashjoin_path
->initial_cost_hashjoin
make_join_rel関数には、次のコードがあります.
RelOptInfo *
make_join_rel(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2)
{
...
/*
* Consider paths using each rel as both outer and inner. Depending on
* the join type, a provably empty outer or inner rel might mean the join
* is provably empty too; in which case throw away any previously computed
* paths and mark the join as dummy. (We do it this way since it's
* conceivable that dummy-ness of a multi-element join might only be
* noticeable for certain construction paths.)
*
* Also, a provably constant-false join restriction typically means that
* we can skip evaluating one or both sides of the join. We do this by
* marking the appropriate rel as dummy. For outer joins, a
* constant-false restriction that is pushed down still means the whole
* join is dummy, while a non-pushed-down one means that no inner rows
* will join so we can treat the inner rel as dummy.
*
* We need only consider the jointypes that appear in join_info_list, plus
* JOIN_INNER.
*/
switch (sjinfo->jointype)
{
case JOIN_INNER:
fprintf(stderr,"JOIN_INNER
");
if (is_dummy_rel(rel1) || is_dummy_rel(rel2) ||
restriction_is_constant_false(restrictlist, false))
{
mark_dummy_rel(joinrel);
break;
}
add_paths_to_joinrel(root, joinrel, rel1, rel2,
JOIN_INNER, sjinfo,
restrictlist);
add_paths_to_joinrel(root, joinrel, rel2, rel1,
JOIN_INNER, sjinfo,
restrictlist);
break;
case JOIN_LEFT:
...
break;
case JOIN_FULL:
...
break;
case JOIN_SEMI:
...
break;
case JOIN_ANTI:
...
break;
...
}
...
}