Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3560
  • 博文数量: 3
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-19 21:56
文章分类
文章存档

2017年(3)

我的朋友
最近访客

分类: Mysql/postgreSQL

2017-06-07 23:26:02

子查询半联接转换 semi-join
一、首先找出子查询插入的位置
 1、[LEFT] JOIN  ( ... ) ON (subquery AND condition)
     ( ... ) =    TABLE_LIST
                     nested_join
                     join_list
                    /   |    \
                  t1    t2...tn
emb_tbl_nest = TABLE_LIST
emb_join_list = join_list


2、 tbs INNER JOIN tblX ON (subquery AND condition) ...
    
语法树:
           TABLE_LIST
           nested_join
           join_list
            /     \
          tbs    tblx

emb_tbl_nest = TABLE_LIST(对于最上层,有可能为NULL)
emb_join_list = join_list(对于最上层,就是top_join_list)


3、tbs LEFT JOIN tbl ON (on_expr AND subq_pred) ...

    TABLE_LIST
    nested_join
    join_list
    /      \
   tbs     tb1


            先转化为:
   TABLE_LIST
   nested_join
   join_list
   /      \
   tbs     TABLE_LIST(sj-wrap)
            nested_join
            join_list
           /
         tb1


   emb_join_list = TABLE_LIST(sj-wrap)->nested_join->join_list
   emb_tbl_nest=  TABLE_LIST(sj-wrap);


 二、创建TABLE_LIST将子查询内的表包装起来
    sj_nest=
      TABLE_LIST::new_nested_join(thd->mem_root, "(sj-nest)",
                                emb_tbl_nest, emb_join_list, this);
emb_join_list->push_back(sj_nest);// sj_nest用于包装转化为半联接的子查询内的表关系
sj_nest.merge_underlying_tables(subq_select);



三、and_items(子查询内的条件,原外部条件(where cond 或 join cond))




具体代码详见convert_subquery_to_semijoin
阅读(348) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:simplify_joins 外联接消除、嵌套消除

给主人留下些什么吧!~~