• PostgreSQL在何处处理 sql查询之十四


    Path莫非指的就是 物理访问路径?

    /*
     * query_planner
     *      Generate a path (that is, a simplified plan) for a basic query,
     *      which may involve joins but not any fancier features.
     *
     * Since query_planner does not handle the toplevel processing (grouping,
     * sorting, etc) it cannot select the best path by itself.    It selects
     * two paths: the cheapest path that produces all the required tuples,
     * independent of any ordering considerations, and the cheapest path that
     * produces the expected fraction of the required tuples in the required
     * ordering, if there is a path that is cheaper for this than just sorting
     * the output of the cheapest overall path.  The caller (grouping_planner)
     * will make the final decision about which to use.
     *
     * Input parameters:
     * root describes the query to plan
     * tlist is the target list the query should produce
     *        (this is NOT necessarily root->parse->targetList!)
     * tuple_fraction is the fraction of tuples we expect will be retrieved
     * limit_tuples is a hard limit on number of tuples to retrieve,
     *        or -1 if no limit
     *
     * Output parameters:
     * *cheapest_path receives the overall-cheapest path for the query
     * *sorted_path receives the cheapest presorted path for the query,
     *                if any (NULL if there is no useful presorted path)
     * *num_groups receives the estimated number of groups, or 1 if query
     *                does not use grouping
     *
     * Note: the PlannerInfo node also includes a query_pathkeys field, which is
     * both an input and an output of query_planner().    The input value signals
     * query_planner that the indicated sort order is wanted in the final output
     * plan.  But this value has not yet been "canonicalized", since the needed
     * info does not get computed until we scan the qual clauses.  We canonicalize
     * it as soon as that task is done.  (The main reason query_pathkeys is a
     * PlannerInfo field and not a passed parameter is that the low-level routines
     * in indxpath.c need to see it.)
     *
     * Note: the PlannerInfo node includes other pathkeys fields besides
     * query_pathkeys, all of which need to be canonicalized once the info is
     * available.  See canonicalize_all_pathkeys.
     *
     * tuple_fraction is interpreted as follows:
     *      0: expect all tuples to be retrieved (normal case)
     *      0 < tuple_fraction < 1: expect the given fraction of tuples available
     *        from the plan to be retrieved
     *      tuple_fraction >= 1: tuple_fraction is the absolute number of tuples
     *        expected to be retrieved (ie, a LIMIT specification)
     * Note that a nonzero tuple_fraction could come from outer context; it is
     * therefore not redundant with limit_tuples.  We use limit_tuples to determine
     * whether a bounded sort can be used at runtime.
     */
    void
    query_planner(PlannerInfo *root, List *tlist,
                  double tuple_fraction, double limit_tuples,
                  Path **cheapest_path, Path **sorted_path,
                  double *num_groups)
    {
        ...
    
        /*
         * Construct RelOptInfo nodes for all base relations in query, and
         * indirectly for all appendrel member relations ("other rels").  This
         * will give us a RelOptInfo for every "simple" (non-join) rel involved in
         * the query.
         *
         * Note: the reason we find the rels by searching the jointree and
         * appendrel list, rather than just scanning the rangetable, is that the
         * rangetable may contain RTEs for rels not actively part of the query,
         * for example views.  We don't want to make RelOptInfos for them.
         */
        add_base_rels_to_query(root, (Node *) parse->jointree);
    
        /*
         * Examine the targetlist and join tree, adding entries to baserel
         * targetlists for all referenced Vars, and generating PlaceHolderInfo
         * entries for all referenced PlaceHolderVars.    Restrict and join clauses
         * are added to appropriate lists belonging to the mentioned relations. We
         * also build EquivalenceClasses for provably equivalent expressions. The
         * SpecialJoinInfo list is also built to hold information about join order
         * restrictions.  Finally, we form a target joinlist for make_one_rel() to
         * work from.
         */
        build_base_rel_tlists(root, tlist);
    
        find_placeholders_in_jointree(root);
    
        joinlist = deconstruct_jointree(root);
        ...
    }

    物理访问,发生在  add_base_rels_to_query 内部

  • 相关阅读:
    62. Unique Paths (JAVA)
    60. Permutation Sequence (JAVA)
    56. Merge Intervals (JAVA)
    53. Maximum Subarray (JAVA)
    Java的volatile
    int和Integer的区别
    Java线程
    spark搭建部署
    spark源码编译
    Scala隐式转换和隐式参数
  • 原文地址:https://www.cnblogs.com/gaojian/p/3094847.html
Copyright © 2020-2023  润新知