Description:
using
key IN (select)
is slower than
from table as t1, (select) as t2 where t1.key=t2.key
see howto reproduce
How to repeat:
fast:
explain
SELECT moeda,valor_face,doc_hash_key FROM dig_documentos as c, (SELECT hash_origem as doc
FROM dig_contacorrente WHERE lote_unidade=1001 AND lote_data="2008-05-12" AND
lote_numero=3
UNION
SELECT hash_origem FROM mov_contacorrente WHERE lote_unidade=1001 AND
lote_data="2008-05-12" AND lote_numero=3
UNION
SELECT cc_hash_baixa FROM dig_baixas WHERE lote_unidade=1001 AND lote_data="2008-05-12"
AND lote_numero=3
UNION
SELECT cc_hash_baixa FROM mov_baixas WHERE lote_unidade=1001 AND lote_data="2008-05-12"
AND lote_numero=3) as d
WHERE c.doc_hash_key=d.doc
UNION
SELECT moeda,valor_face,doc_hash_key FROM mov_documentos AS a,(
SELECT SQL_SMALL_RESULT hash_origem as doc FROM dig_contacorrente WHERE
lote_unidade=1001 AND lote_data="2008-05-12" AND lote_numero=3
UNION all
SELECT hash_origem FROM mov_contacorrente WHERE lote_unidade=1001 AND
lote_data="2008-05-12" AND lote_numero=3
UNION all
SELECT cc_hash_baixa FROM dig_baixas WHERE lote_unidade=1001 AND lote_data="2008-05-12"
AND lote_numero=3
UNION all
SELECT cc_hash_baixa FROM mov_baixas WHERE lote_unidade=1001 AND lote_data="2008-05-12"
AND lote_numero=3
) as b
WHERE
a.doc_hash_key =b.doc
GROUP BY doc_hash_key
slow:
explain
SELECT moeda,valor_face,doc_hash_key FROM dig_documentos WHERE doc_hash_key IN (SELECT
hash_origem FROM dig_contacorrente WHERE lote_unidade=1001 AND lote_data="2008-05-12" AND
lote_numero=3
UNION
SELECT hash_origem FROM mov_contacorrente WHERE lote_unidade=1001 AND
lote_data="2008-05-12" AND lote_numero=3
UNION
SELECT cc_hash_baixa FROM dig_baixas WHERE lote_unidade=1001 AND lote_data="2008-05-12"
AND lote_numero=3
UNION
SELECT cc_hash_baixa FROM mov_baixas WHERE lote_unidade=1001 AND lote_data="2008-05-12"
AND lote_numero=3)
UNION
SELECT moeda,valor_face,doc_hash_key FROM mov_documentos WHERE doc_hash_key IN (SELECT
hash_origem FROM dig_contacorrente WHERE lote_unidade=1001 AND lote_data="2008-05-12" AND
lote_numero=3 UNION SELECT hash_origem FROM mov_contacorrente WHERE lote_unidade=1001 AND
lote_data="2008-05-12" AND lote_numero=3 UNION SELECT cc_hash_baixa FROM dig_baixas WHERE
lote_unidade=1001 AND lote_data="2008-05-12" AND lote_numero=3 UNION SELECT cc_hash_baixa
FROM mov_baixas WHERE lote_unidade=1001 AND lote_data="2008-05-12" AND lote_numero=3)
GROUP BY doc_hash_key
Suggested fix:
i think that some optimize options could be used for example
key in (SELECT keys from table)
should use the table
and
key in (SELECT SQL_BUFFER_RESULT keys from table)
should use the "buffered result" instead of table
this is the same thing i did with
from (select keys from table) as c where ....