[firebase-br] Interbase rápido x Firebird muito lento. Me ajudem com esse problema por favor.

Eduardo Jedliczka jedyfb em gmail.com
Qui Maio 14 12:50:51 -03 2009


O Douglas está certo, o exists é disparado a cada registro (por isto é
importante que sejam selects bem leves e simples, eu sempre procuro usar
o First 1 para tentar ganhar alguns milésimos de segundo) 

Como a BLR é compilada uma única vez, e o boa parte dos dados
provavelmente já estarão em cache, o exists é muito rápido.

Quanto ao IN, ele gasta muita memória e processamento, pois é necessário
montar toda a lista de valores (que podem nem ser usados) antes de usar
o select principal, e ver registro a registro se ele está lá.

Em termos práticos, imagine que você tenha um caderninho com os
telefones dos seus amigos. No IN primeiro você copia todos eles para uma
nova folha, e para cada telefone da sua conta telefônica você verifique
se ele está nesta lista. No exists, você faz o contrário, para cada
telefone na sua conta, você procura na agenda (que provavelmente estará
em órdem de telefone) e procura o número.

Qual você acha mais fácil e rápido ?

Abraço

Eduardo

Em Qui, 2009-05-14 às 12:19 -0300, Magno System escreveu:

> Oi Douglas, agora você me fez ficar com dúvida. Se o EXISTS executa 1 select 
> para cada registro da tabela principal, no teste do email anterior, seriam 
> 28052 SELECT'S do EXISTS contra 1 do IN. Então como se explica o EXISTS ser 
> mais rápido ??? Não é ao contrário não ???
> 
> 
> ----- Original Message ----- 
> From: "Douglas Tosi" <douglasht em gmail.com>
> To: "FireBase" <lista em firebase.com.br>
> Sent: Thursday, May 14, 2009 11:26 AM
> Subject: Re: [firebase-br]Interbase rápido x Firebird muito lento. Me ajudem 
> com esse problema por favor.
> 
> 
> 2009/5/14 Magno System <magno em speet.com.br>:
> > Na minha opinião, a regra é simples:
> > [NOT] IN (Valor1, Valor2, ... , ValorN)
> > [NOT] EXISTS (SELECT CAMPO FROM TABELA)
> 
> A exceção é quando o select interno é complexo e lento.
> O IN executa este select interno uma vez só e faz comparação natural.
> Já com exists o select interno tende a ser executado uma vez para cada
> registro de select pai.
> 
> Ou seja, se o select interno for lento, mas retornar poucos registros,
> vale mais usar o IN.
> Isto tudo é claro só serve para se ter uma ideia de como iniciar. Vale
> testar os dois casos e medir a diferença.
> 
> hth,



Mais detalhes sobre a lista de discussão lista