子查询半联接转换 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) |