README
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:5k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. Summary
  2. -------
  3. The optimizer generates optimial query plans by doing several steps:
  4. 1) Take each relation in a query, and make a RelOptInfo structure for
  5. it.  Find each way of accessing the relation, called a Path, including
  6. sequential and index scans, and add it to RelOptInfo.pathlist.  Also
  7. create RelOptInfo.joininfo that lists all the joins that involve this
  8. relation.  For example, the WHERE clause "tab1.col1 = tab2.col1"
  9. generates a JoinInfo for tab1 listing tab2 as an unjoined relation, and
  10. tab2's joininfo shows tab1 as an unjoined relation.
  11. 2) Join each RelOptInfo to other RelOptInfo as specified in
  12. RelOptInfo.joininfo.  At this point each RelOptInfo is a single
  13. relation, so you are joining every relation to the other relations as
  14. joined in the WHERE clause.
  15. Joins occur using two RelOptInfos.  One is outer, the other inner. 
  16. Outers drive lookups of values in the inner.  In a nested loop, lookups
  17. of values in the inner occur by scanning to find each matching inner
  18. row.  In a mergejoin, inner and outer rows are ordered, and are accessed
  19. in order, so only one scan of inner is required to perform the entire
  20. join.  In a hashjoin, inner rows are hashed for lookups.
  21. Each unique join combination becomes a new RelOptInfo.  The RelOptInfo
  22. is now the joining of two relations.  RelOptInfo.pathlist are various
  23. paths to create the joined result, having different orderings depending
  24. on the join method used.
  25. 3) At this point, every RelOptInfo is joined to each other again, with
  26. a new relation added to each RelOptInfo.  This continues until all
  27. relations have been joined into one RelOptInfo, and the cheapest Path is
  28. chosen.
  29.     SELECT  *
  30.     FROM    tab1, tab2, tab3, tab4
  31.     WHERE   tab1.col = tab2.col AND
  32.         tab2.col = tab3.col AND
  33.         tab3.col = tab4.col
  34.     Tables 1, 2, 3, and 4 are joined as:
  35.     {1 2},{2 3},{3 4}
  36.     {1 2 3},{2 3 4}
  37.     {1 2 3 4}
  38.     SELECT  *
  39.     FROM    tab1, tab2, tab3, tab4
  40.     WHERE   tab1.col = tab2.col AND
  41.         tab1.col = tab3.col AND
  42.         tab1.col = tab4.col
  43.     Tables 1, 2, 3, and 4 are joined as:
  44.     {1 2},{1 3},{1 4}
  45.     {1 2 3},{1 3 4},{1,2,4}
  46.     {1 2 3 4}
  47. In the default left-handed joins, each RelOptInfo adds one
  48. single-relation RelOptInfo in each join pass, and the added RelOptInfo
  49. is always the inner relation in the join.  In right-handed joins, the
  50. added RelOptInfo is the outer relation in the join.  In bushy plans,
  51. multi-relation RelOptInfo's can be joined to other multi-relation
  52. RelOptInfo's. 
  53. Optimizer Functions
  54. -------------------
  55. These directories take the Query structure returned by the parser, and
  56. generate a plan used by the executor.  The /plan directory generates the
  57. plan, the /path generates all possible ways to join the tables, and
  58. /prep handles special cases like inheritance.  /utils is utility stuff.
  59. planner()
  60.  handle inheritance by processing separately
  61. -init_query_planner()
  62.   preprocess target list
  63.   preprocess qualifications(WHERE)
  64. --query_planner()
  65.    cnfify()
  66.     Summary:
  67.      Simple cases with all AND's are handled by removing the AND's:
  68.      convert:   a = 1 AND b = 2 AND c = 3
  69.      to:        a = 1, b = 2, c = 3
  70.      Qualifications with OR's are handled differently.  OR's inside AND
  71.      clauses are not modified drastically:
  72.      convert:   a = 1 AND b = 2 AND (c = 3 OR d = 4)
  73.      to:        a = 1, b = 2, c = 3 OR d = 4
  74.      OR's in the upper level are more complex to handle:
  75.      convert:   (a = 1 AND b = 2) OR c = 3
  76.      to:        (a = 1 OR c = 3) AND (b = 2 OR c = 3)
  77.      finally:   (a = 1 OR c = 3), (b = 2 OR c = 3)
  78.      These clauses all have to be true for a result to be returned,
  79.      so the optimizer can choose the most restrictive clauses.
  80.    pull out constants from target list
  81.    get a target list that only contains column names, no expressions
  82.    if none, then return
  83. ---subplanner()
  84.     make list of relations in target
  85.     make list of relations in where clause
  86.     split up the qual into restrictions (a=1) and joins (b=c)
  87.     find relation clauses can do merge sort and hash joins
  88. ----make_one_rel()
  89.      set_base_rel_pathlist()
  90.       find scan and all index paths for each relation
  91.       find selectivity of columns used in joins
  92. -----make_one_rel_by_joins()
  93.       jump to geqo if needed
  94.       again:
  95.        make_rels_by_joins():
  96.         for each joinrel:
  97.          make_rels_by_clause_joins()
  98.           for each rel's joininfo list:
  99.            if a join from the join clause adds only one relation, do the join
  100.          or make_rels_by_clauseless_joins()
  101.        update_rels_pathlist_for_joins()
  102.         generate nested,merge,hash join paths for new rel's created above
  103.        merge_rels_with_same_relids()
  104.         merge RelOptInfo paths that have the same relids because of joins
  105.        rels_set_cheapest()
  106.         set cheapest path
  107.        if all relations in one RelOptInfo, return
  108.    do group(GROUP)
  109.    do aggregate
  110.    put back constants
  111.    re-flatten target list
  112.  make unique(DISTINCT)
  113.  make sort(ORDER BY)
  114. Optimizer Structures
  115. --------------------
  116. RelOptInfo      - a relation or joined relations
  117.  RestrictInfo   - restriction clauses, like "x = 3"
  118.  JoinInfo       - join clauses, including the relids needed for the join
  119.  Path           - every way to generate a RelOptInfo(sequential,index,joins)
  120.   IndexPath     - index scans
  121.   NestPath      - nested joins
  122.   MergePath     - merge joins
  123.   HashPath      - hash joins
  124.  PathOrder      - every ordering type (sort, merge of relations)