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?