| Bug #35032 | Wrong execution plan for uncorrelated subquery when semijoin is applicable | ||
|---|---|---|---|
| Submitted: | 4 Mar 2008 11:44 | Modified: | 3 May 2008 3:58 |
| Reporter: | Alexey Stroganov | Email Updates: | |
| Status: | Duplicate | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S3 (Non-critical) |
| Version: | 6.0.4 | OS: | Any |
| Assigned to: | Assigned Account | CPU Architecture: | Any |
[4 Mar 2008 11:44]
Alexey Stroganov
[4 Mar 2008 11:51]
Alexey Stroganov
Datagen/loader tool for test case
Attachment: subquery-datagen.pl (application/x-perl, text), 7.97 KiB.
[4 Mar 2008 12:12]
Alexey Stroganov
just found out that for smaller dataset order of tables looks correct: perl subquery-datagen.pl --generate --ot-rows=100000 --load-data --database=test --user=test --socket=/tmp/mysql.sock mysql> explain select count(id) from ot where ot.expr_key IN (select it.expr_key from it where it.id < 5000) and ot.id<300000; +----+-------------+-------+------+------------------+----------+---------+-------------------+--------+------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+------------------+----------+---------+-------------------+--------+------------------------------+ | 1 | PRIMARY | it | ALL | PRIMARY,expr_key | NULL | NULL | NULL | 500000 | Using where; Start temporary | | 1 | PRIMARY | ot | ref | PRIMARY,expr_key | expr_key | 4 | subq3.it.expr_key | 1 | Using where; End temporary | +----+-------------+-------+------+------------------+----------+---------+-------------------+--------+------------------------------+ 2 rows in set (0.00 sec) mysql> explain select count(ot.id) from ot,it where ot.expr_key = it.expr_key and it.id < 5000 and ot.id<300000; +----+-------------+-------+-------+------------------+----------+---------+-------------------+------+----------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+------------------+----------+---------+-------------------+------+----------------------------------+ | 1 | SIMPLE | it | range | PRIMARY,expr_key | PRIMARY | 4 | NULL | 5123 | Using index condition; Using MRR | | 1 | SIMPLE | ot | ref | PRIMARY,expr_key | expr_key | 4 | subq3.it.expr_key | 1 | Using where | +----+-------------+-------+-------+------------------+----------+---------+-------------------+------+----------------------------------+ 2 rows in set (0.00 sec)
[18 Mar 2008 10:34]
Alexey Stroganov
Updated version of datagen script
Attachment: subquery-datagen.pl (application/x-perl, text), 7.99 KiB.
[27 Mar 2008 18:10]
Susanne Ebrecht
Verified as described with: 6.0.5-alpha-debug I only used 10^6 rows at the perl test because with 10^7 rows I just got the message: "Not enough disk space". But it occurs here also with 10^6 rows.
[2 May 2008 4:51]
Sergey Petrunya
With the latest mysql-6.0-opt, tip cset
ChangeSet@1.2633, 2008-05-02 02:41:35+04:00, sergefp@mysql.com +3 -0
(where we had a lot of subquery bugs fixed), I get
mysql> explain select count(ot.id) from ot,it where ot.expr_key = it.expr_key and it.id < 5000 and ot.id<300000\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: it
type: range
possible_keys: PRIMARY,expr_key
key: PRIMARY
key_len: 4
ref: NULL
rows: 5036
Extra: Using index condition; Using MRR
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: ot
type: ref
possible_keys: PRIMARY,expr_key
key: expr_key
key_len: 4
ref: bug35032.it.expr_key
rows: 1
Extra: Using where
2 rows in set (0.00 sec)
It seems to be fixed by the recent subquery fixes. Feel free to reopen if it shows up again on a recent tree.
[2 May 2008 4:57]
Sergey Petrunya
Sorry, the last comment didn't make much sense, try again:
With the latest mysql-6.0-opt, tip cset
ChangeSet@1.2633, 2008-05-02 02:41:35+04:00, sergefp@mysql.com +3 -0
(where we had a lot of subquery bugs fixed), I get
mysql> explain extended select count(id) from ot where ot.expr_key IN (select it.expr_key from it where it.id < 5000) and ot.id<300000\G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: it
type: range
possible_keys: PRIMARY,expr_key
key: PRIMARY
key_len: 4
ref: NULL
rows: 5036
filtered: 75.00
Extra: Using index condition; Using MRR; Start temporary
*************************** 2. row ***************************
id: 1
select_type: PRIMARY
table: ot
type: ref
possible_keys: PRIMARY,expr_key
key: expr_key
key_len: 4
ref: bug35032.it.expr_key
rows: 1
filtered: 100.00
Extra: Using where; End temporary
2 rows in set, 1 warning (0.00 sec)
[3 May 2008 3:58]
Sergey Petrunya
Fixed by fix for BUG#35674. Changing status to Duplicate.
