terça-feira, 25 de março de 2014

Condição "IN" no Mysql

Olá pessoal do Select.

Então, gostaria de compartilhar um problema vivido no SQL.

Sempre costumo utilizar a condição NOT IN('x', 'y') em alguns casos. Só que a mesma numa quantidade excessiva de registro se torna problemática.

Um exemplo foi a base da Bahia, tabela estoque. Com  cerca de 500 mil registros. Um simples select com a condição not in(), deixava  super lento. Depois de vários testes, descobri que se fizesse um IN() ao invés de um Not in(), caiu para umas 20x mais rápido o relatório:

Segue o resultado:


"NOT INT:"

SELECT SUM(e.quantidade) AS saldo FROM estoque e
WHERE e.emp_id = 2
AND e.origem not in ('PC', 'EP', 'BP', 'PV', 'BV')
-- AND e.origem IN ('AC', 'NF', 'BR', 'EM', 'OP', 'PM')
AND e.origemmaterial = 'R'
AND e.codigomaterial = '0588'
AND e.tipooperacao = 'S'
AND e.dataoperacao >= '2013-03-01'
AND e.dataoperacao <= '2014-03-24'
AND e.cancelado = 'N';
/* Affected rows: 0  Registros encontrados: 1  Avisos: 0  Duração de 1 query: 21,856 sec. */


"IN"

SELECT SUM(e.quantidade) AS saldo FROM estoque e
WHERE e.emp_id = 2
AND e.origem IN ('AC', 'NF', 'BR', 'EM', 'OP', 'PM')
AND e.origemmaterial = 'R'
AND e.codigomaterial = '0588'
AND e.tipooperacao = 'S'
AND e.dataoperacao >= '2013-03-01'
AND e.dataoperacao <= '2014-03-24'
AND e.cancelado = 'N';
/* Affected rows: 0  Registros encontrados: 1  Avisos: 0  Duração de 1 query: 0,437 sec. */

Resumo: 21,856 sec. ---> 0,437 sec!!

Inacreditável não?

Nenhum comentário: