Interbase rápido x Firebird muito lento. Me ajudem com esse problema por favor.

Marcelo Pinto marcelo.marcelopinto em gmail.com
Qua Maio 13 16:42:14 -03 2009


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