| Bug #35468 | Slowdown and wrong result for uncorrelated subquery w/o where | ||
|---|---|---|---|
| Submitted: | 20 Mar 2008 20:01 | Modified: | 22 Nov 2010 0:43 |
| Reporter: | Alexey Stroganov | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S3 (Non-critical) |
| Version: | 6.0.4 | OS: | Any |
| Assigned to: | Sergey Petrunya | CPU Architecture: | Any |
| Tags: | LooseScan, subqueries | ||
[20 Mar 2008 20:01]
Alexey Stroganov
[20 Mar 2008 20:03]
Alexey Stroganov
Datagen/loader tool for test case
Attachment: subquery-datagen.pl (application/x-perl, text), 6.97 KiB.
[3 May 2008 5:37]
Sergey Petrunya
With the latest mysql-6.0-opt, I get:
mysql> explain select count(expr_key) from ot where expr_key in ( SELECT expr_key FROM it)\G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: ot
type: index
possible_keys: NULL
key: expr_key
key_len: 4
ref: NULL
rows: 10000
Extra: Using where; Using index
*************************** 2. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: it
type: index_subquery
possible_keys: expr_key
key: expr_key
key_len: 4
ref: func
rows: 1
Extra: Using index
2 rows in set (0.00 sec)
Considering the table it has 50K rows, and it.expr_key has 50K distinct values, this is the best join order and the best strategy to run this semi-join.
Query times obtained by re-running the query w/ different values of @@optimizer_switch:
semi-join: 0.17 sec
materialization: 0.29 sec
no optimizations: 0.18 sec
[3 May 2008 6:08]
Sergey Petrunya
Oops. Please disregard the last comment. I was working on the wrong dataset. The attached subquery-datagen.pl actually doesn't understand --fanout=32 option and so has generated the data with --fanout=5. Using the script attached to BUG#35032, I can repeat.
[3 May 2008 7:39]
Sergey Petrunya
mysql> explain select count(expr_key) from ot where expr_key in ( SELECT expr_key FROM it); +----+-------------+-------+-------+---------------+----------+---------+----------------- ---+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+----------+---------+----------------- ---+--------+-------------+ | 1 | PRIMARY | it | index | expr_key | PRIMARY | 4 | NULL | 320000 | LooseScan | The problem lies here. Loose index scan should be not done on index expr_key, not on PRIMARY index.
[28 May 2008 5:55]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/47116 ChangeSet@1.2638, 2008-05-28 09:54:00+04:00, sergefp@mysql.com +9 -0 BUG#35468: Slowdown and wrong result for uncorrelated subquery w/o where - Moved LooseScan functionality from READ_RECORD functions to join runtime. (This enables use of insideout together with range access) - Let best_access_path() save the number of the index to be used by the insideout scan and #keyparts (just keeping a flag wasn't enough for full-index insideout scans). - Made setup_semijoin_dups_elimination() define and use an enum instead of numeric constants.
[29 May 2008 3:09]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/47180 ChangeSet@1.2638, 2008-05-29 07:07:29+04:00, sergefp@mysql.com +9 -0 BUG#35468: Slowdown and wrong result for uncorrelated subquery w/o where - Moved LooseScan functionality from READ_RECORD functions to join runtime. (This enables use of insideout together with range access) - Let best_access_path() save the number of the index to be used by the insideout scan and #keyparts (just keeping a flag wasn't enough for full-index insideout scans). - Made setup_semijoin_dups_elimination() define and use an enum instead of numeric constants. - Addressed review feedback
[31 May 2008 7:33]
Sergey Petrunya
Pushed into bzr_6.0-opt tree
[31 May 2008 17:17]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/47280 2649 Sergey Petrunia 2008-05-31 BUG#35468: Slowdown and wrong result for uncorrelated subquery w/o where - Moved LooseScan functionality from READ_RECORD functions to join runtime. (This enables use of insideout together with range access) - Let best_access_path() save the number of the index to be used by the insideout scan and #keyparts (just keeping a flag wasn't enough for full-index insideout scans). - Made setup_semijoin_dups_elimination() define and use an enum instead of numeric constants. - Addressed review feedback
[31 May 2008 17:29]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/47283 2649 Sergey Petrunia 2008-05-31 BUG#35468: Slowdown and wrong result for uncorrelated subquery w/o where - Moved LooseScan functionality from READ_RECORD functions to join runtime. (This enables use of insideout together with range access) - Let best_access_path() save the number of the index to be used by the insideout scan and #keyparts (just keeping a flag wasn't enough for full-index insideout scans). - Made setup_semijoin_dups_elimination() define and use an enum instead of numeric constants. - Addressed review feedback
[28 Aug 2008 20:15]
Bugs System
Pushed into 6.0.7-alpha (revid:cbell@mysql.com-20080822132131-uveo6wiuecy6m2b8) (version source revid:cbell@mysql.com-20080822132131-uveo6wiuecy6m2b8) (pib:3)
[2 Sep 2008 18:37]
Paul DuBois
Noted in 6.0.7 changelog. For uncorrelated subqueries without a WHERE clause, use of semi-join or materialization options could result in slow performance, or use of the LooseScan strategy could produce incorrect results.
[13 Sep 2008 22:22]
Bugs System
Pushed into 6.0.6-alpha (revid:sergefp@mysql.com-20080531071457-utx02hn5wr0d58sp) (version source revid:hakan@mysql.com-20080716105246-eg0utbybp122n2w9) (pib:3)
[16 Aug 2010 6:33]
Bugs System
Pushed into mysql-next-mr (revid:alik@sun.com-20100816062819-bluwgdq8q4xysmlg) (version source revid:alik@sun.com-20100816062612-enatdwnv809iw3s9) (pib:20)
[13 Nov 2010 16:25]
Bugs System
Pushed into mysql-trunk 5.6.99-m5 (revid:alexander.nozdrin@oracle.com-20101113155825-czmva9kg4n31anmu) (version source revid:vasil.dimov@oracle.com-20100629074804-359l9m9gniauxr94) (merge vers: 5.6.99-m4) (pib:21)
[22 Nov 2010 0:43]
Paul DuBois
Noted in 5.6.1 changelog.
[23 Nov 2010 2:21]
Paul DuBois
Correction: No 5.6.1 changelog entry. Bug does not appear in any released 5.6.x version.
