2011-07-06 14:15:11 |
Philip Stoev |
description |
The following query
SELECT *
FROM t2
RIGHT JOIN ( SELECT * FROM t1 ) AS alias2
ON alias2.f10 != 0
WHERE alias2.f10 IN ( SELECT f11 FROM t1 );
returns no rows when executed with derived_merge=on,semijoin=off and 1 row in all other cases (e.g. when run with other switches or by manually in-lining the derived table, or inlining the subquery).
Explain:
| 1 | PRIMARY | t1 | system | NULL | NULL | NULL | NULL | 1 | |
| 1 | PRIMARY | t2 | ALL | NULL | NULL | NULL | NULL | 2 | |
| 3 | SUBQUERY | t1 | system | NULL | NULL | NULL | NULL | 1 | |
minimal optimizer switch:derived_merge=on,semijoin=off
full optimizer switch:
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=on,derived_merge=on,derived_with_keys=on,firstmatch=off,loosescan=off,materialization=on,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=on,mrr=on,mrr_cost_based=off,mrr_sort_keys=on,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=on,table_elimination=on
test case:
CREATE TABLE t1 ( f10 int, f11 int) ;
INSERT IGNORE INTO t1 VALUES (0,0);
CREATE TABLE t2 ( f11 int) ;
INSERT INTO t2 VALUES (0),(0);
SELECT *
FROM t2
RIGHT JOIN ( SELECT * FROM t1 ) AS alias2
ON alias2.f10 != 0
WHERE alias2.f10 IN ( SELECT f11 FROM t1 ); |
The following query
SELECT *
FROM t2
RIGHT JOIN ( SELECT * FROM t1 ) AS alias2
ON alias2.f10 != 0
WHERE alias2.f10 IN ( SELECT f11 FROM t1 );
returns no rows when executed with derived_merge=on,semijoin=off and 1 row in all other cases (e.g. when run with other switches or by manually in-lining the derived table, or inlining the subquery, rotating the join to be LEFT JOIN).
Explain:
| 1 | PRIMARY | t1 | system | NULL | NULL | NULL | NULL | 1 | |
| 1 | PRIMARY | t2 | ALL | NULL | NULL | NULL | NULL | 2 | |
| 3 | SUBQUERY | t1 | system | NULL | NULL | NULL | NULL | 1 | |
minimal optimizer switch:derived_merge=on,semijoin=off
full optimizer switch:
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=on,derived_merge=on,derived_with_keys=on,firstmatch=off,loosescan=off,materialization=on,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=on,mrr=on,mrr_cost_based=off,mrr_sort_keys=on,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=on,table_elimination=on
test case:
CREATE TABLE t1 ( f10 int, f11 int) ;
INSERT IGNORE INTO t1 VALUES (0,0);
CREATE TABLE t2 ( f11 int) ;
INSERT INTO t2 VALUES (0),(0);
SELECT *
FROM t2
RIGHT JOIN ( SELECT * FROM t1 ) AS alias2
ON alias2.f10 != 0
WHERE alias2.f10 IN ( SELECT f11 FROM t1 ); |
|