allpath.c文件分析

allpath.c文件位于backend/optimizer/path文件夹下。

该文件包含的函数如下所示:

static void set_base_rel_pathlists(PlannerInfo *root);
这个函数的作用是找出基本关系中每个实体可能的扫描路径,它会考虑顺序查找和基于索引的查找,然后把每个可用的查询路径插入pathlist。这个函数内部会调用set_rel_pathlist。
static void set_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,Index rti, RangeTblEntry *rte);
这个函数的作用是为每个基本关系构造执行路径。set_base_rel_pathlists会调用这个函数。另外这个函数会根据rte的不同调用不同的函数。
static void set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,RangeTblEntry *rte);
处理rel->rtekind=RTE_RELATION的情况,这个函数会被set_rel_pathlist调用。
static void set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,Index rti, RangeTblEntry *rte);
处理rte->inh=true的情况,这个函数会被set_rel_pathlist调用。
static void set_dummy_rel_pathlist(RelOptInfo *rel);
这个函数会被set_plain_rel_pathlist调用,它的作用是为一个关系生成虚拟的执行路径,并找到一个最优的路径。
static void set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel,Index rti, RangeTblEntry *rte);
处理rel->rtekind=RTE_SUBQUERY的情况,这个函数会被set_rel_pathlist调用。
static void set_function_pathlist(PlannerInfo *root, RelOptInfo *rel,RangeTblEntry *rte);
处理rel->rtekind=RTE_FUNCTION的情况,这个函数会被set_rel_pathlist调用。
static void set_values_pathlist(PlannerInfo *root, RelOptInfo *rel,RangeTblEntry *rte);
处理rel->rtekind=RTE_VALUES的情况,这个函数会被set_rel_pathlist调用。
static void set_cte_pathlist(PlannerInfo *root, RelOptInfo *rel,RangeTblEntry *rte);
处理rel->rtekind=RTE_CTE同时rte->self_reference=false的情况,这个函数会被set_rel_pathlist调用。
static void set_worktable_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte);
处理rel->rtekind=RTE_CTE同时rte->self_reference=true的情况,这个函数会被set_rel_pathlist调用。
static RelOptInfo *make_rel_from_joinlist(PlannerInfo *root, List *joinlist);
这个函数的作用是利用joinlist生成操作路径以指导连接查询。该函数会被make_one_rel函数调用。
static bool subquery_is_pushdown_safe(Query *subquery, Query *topquery,bool *differentTypes);
这个函数对查询语句中涉及的子查询语句进行检查,以确定子查询的类型。该函数会被set_subquery_pathlist,recurse_pushdown_safe这两个函数调用。
static bool recurse_pushdown_safe(Node *setOp, Query *topquery,bool *differentTypes);
处理有递归的情况。
static void compare_tlist_datatypes(List *tlist, List *colTypes,bool *differentTypes);
对比tlist和colTypes中的数据,如果有不同就作标记。
static bool qual_is_pushdown_safe(Query *subquery, Index rti, Node *qual,bool *differentTypes);
static void subquery_push_qual(Query *subquery,RangeTblEntry *rte, Index rti, Node *qual);
将一个安全的自查询进栈。
static void recurse_push_qual(Node *setOp, Query *topquery,RangeTblEntry *rte, Index rti, Node *qual);
处理有递归的情况。
RelOptInfo *make_one_rel(PlannerInfo *root, List *joinlist)//对于一个PlannerInfo找出所有的执行路径。

在这个文件中最主要的函数应该是make_one_rel(PlannerInfo *root, List *joinlist),用于构建一条语句所有的执行路径。

转载于:https://www.cnblogs.com/tjdx415/archive/2010/01/20/1652690.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值