[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