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

Eliezer de Souza eliezer em xpert.com.br
Qua Maio 13 17:02:11 -03 2009


Tenta assim amigo

select * from associados
inner join pagamentos on pagamentos.codigo_associado =
associados.codigo_associado
where pagamentos.ano_pagamento = 2008







-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Marcelo Pinto
Enviada em: quarta-feira, 13 de maio de 2009 16:42
Para: lista em firebase.com.br
Assunto: Interbase rápido 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









Mais detalhes sobre a lista de discussão lista