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

Eduardo C ecostas em gmail.com
Ter Maio 26 19:38:35 -03 2009


Rodolpho,

provavelmente você já resolveu seu problema. De qualquer forma, como acabei
de ler a mensagem (tenho mais de 1000 mensagens da lista por ler ;) ), a
minha sugestão, válida para outros SGBDs, é evitar nested selects e trocar
por joins ou left joins.

Algo como
    select a.* from associados a inner join pagamentos p on
p.codigo_associado = a.codigo_associado where p.ano_pagamento = 2008

para pegar quem pagou (dependendo do SGBD, você pode precisar de uma
cláusula DISTINCTROW ou equivalente)
e

    select a.* from associados a left join pagamentos p on
p.codigo_associado = a.codigo_associado where p.ano_pagamento = 2008 and
p.codigo_associado is null
para pegar quem não pagou (você terá somente uma linha por associado)

SE o sono não tiver atrapalhado, é isso.

Eduardo

2009/5/13 Rodolpho da Silva <nascimento em gko.com.br>

> Marcelo,
>
> Experimente este select......
>
>
> select a.* from associados a
> where not exists (select codigo_associado
>                          from pagamentos p
>                          where p.codigo_associado = a.codigo_associado
>                              and p.ano_pagamento = 2008)
>
>
>  ----- Original Message -----
>  From: Marcelo Pinto
>  To: lista em firebase.com.br
>  Sent: Wednesday, May 13, 2009 4:42 PM
>  Subject: Interbase rpido x Firebird muito lento. Me ajudem com esse
> problema por favor.
>
>
>
>  Pessoal é o seguinte, tenho as tabelas ASSOCIADOS e PAGAMENTOS. E preciso
>  saber quem pagou uma determinada anuidade e quem não pagou.
>
>  As tabelas estão assim:
>
>  ASSOCIADOS  (5696 registros)
>  -------------
>  codigo_associado    nome_associado
>  01                        Fulano
>  02                        Beltrano
>  03                        Ciclano
>
>  PAGAMENTOS  (17114 registros)
>  -------------
>  codigo_associado  ano_pagamento  valor_pagamento
>  01                      2007                 100,00
>  01                      2008                 110,00
>  01                      2009                 120,00
>  02                      2008                 110,00
>  02                      2009                 120,00
>  03                      2008                 110,00
>
>  Fiz o seguinte sql para mostrar quem pagou (2008 por ex.):
>  select * from associados
>  where codigo_associado in (select codigo_associado from pagamentos where
>  ano_pagamento = 2008)
>
>  Esse o firebird roda tranquilo.
>
>  O meu problema maior é quando preciso listar os que não pagaram (2008 de
>  novo):
>
>  select * from associados
>  where codigo_associado NOT in (select codigo_associado from pagamentos
> where
>  ano_pagamento = 2008)
>
>  Nesse caso o firebird demora cerca de 2min pra terminar a consulta e com o
>  interbase é instantâneo.
>  Pq essa diferença toda???
>
>  Será que alguém pode me dar uma ajuda?
>  Já tentei utilizar inner join, mas não dava os resultados esperados.
>  Acabava tendo q utilizar o NOT IN de qualquer forma.  E é exatamente ele q
>  deixa tudo muito lento.
>
>  A tabela associados está com PK no codigo_associado e a tabela de
> pagamentos
>  está com PK no codigo_associado,ano_pagamento.
>
>  A única diferença na execução do sql entre o firebird e o interbase foi no
>  PLAN.
>  Enquanto o firebird utilizou: PLAN (PAGAMENTOS NATURAL) PLAN (ASSOCIADOS
>  NATURAL)
>  O interbase fez: PLAN (PAGAMENTOS INDEX (RDB$PRIMARY3)) PLAN (ASSOCIADOS
>  NATURAL)
>
>  Alguém tem idéia do que pode estar acontecendo?
>  Ou alguma idéia pra eu montar um select mais rápido?
>
>  Obrigado desde já.
>  Marcelo Pinto
>
>
>
>
>
>
>
>
> ------------------------------------------------------------------------------
>
>
>  ______________________________________________
>  FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>  Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
>  Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>
>
> ------------------------------------------------------------------------------
>
>
>
>  No virus found in this incoming message.
>  Checked by AVG - www.avg.com
>  Version: 8.5.325 / Virus Database: 270.12.27/2112 - Release Date: 05/13/09
> 07:04:00
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista