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

Carlos H. Cantu listas em warmboot.com.br
Qua Maio 13 17:09:36 -03 2009


O NOT IN nas versões mais recentes do FB não consegue usar índices,
portanto a performance cai. Antes ele usava, mas o resultado podia ser
inconsistente.

Experimente alterar o seu select, para ao invés de usar NOT IN, usar
NOT EXISTS. Algo como:

select *
from associados a
where not exists (select * from pagamentos p where
(p.ano_pagamento = 2008) and (p.codigo_associado =
 a.codigo_associado))

Veja mais informações no release notes do Firebird.

[]s
Carlos H. Cantu
www.FireBase.com.br - www.firebirdnews.org
www.warmboot.com.br - blog.firebase.com.br


MP> Pessoal é o seguinte, tenho as tabelas ASSOCIADOS e PAGAMENTOS. E preciso
MP> saber quem pagou uma determinada anuidade e quem não pagou.

MP> As tabelas estão assim:

MP> ASSOCIADOS  (5696 registros)
MP> -------------
MP> codigo_associado    nome_associado
MP> 01                        Fulano
MP> 02                        Beltrano
MP> 03                        Ciclano

MP> PAGAMENTOS  (17114 registros)
MP> -------------
MP> codigo_associado  ano_pagamento  valor_pagamento
MP> 01                      2007                 100,00
MP> 01                      2008                 110,00
MP> 01                      2009                 120,00
MP> 02                      2008                 110,00
MP> 02                      2009                 120,00
MP> 03                      2008                 110,00

MP> Fiz o seguinte sql para mostrar quem pagou (2008 por ex.):
MP> select * from associados
MP> where codigo_associado in (select codigo_associado from pagamentos where
MP> ano_pagamento = 2008)

MP> Esse o firebird roda tranquilo.

MP> O meu problema maior é quando preciso listar os que não pagaram (2008 de
MP> novo):

MP> select * from associados
MP> where codigo_associado NOT in (select codigo_associado from pagamentos where
MP> ano_pagamento = 2008)

MP> Nesse caso o firebird demora cerca de 2min pra terminar a consulta e com o
MP> interbase é instantâneo.
MP> Pq essa diferença toda???

MP> Será que alguém pode me dar uma ajuda?
MP> Já tentei utilizar inner join, mas não dava os resultados esperados.
MP> Acabava tendo q utilizar o NOT IN de qualquer forma.  E é exatamente ele q
MP> deixa tudo muito lento.

MP> A tabela associados está com PK no codigo_associado e a tabela de pagamentos
MP> está com PK no codigo_associado,ano_pagamento.

MP> A única diferença na execução do sql entre o firebird e o interbase foi no
MP> PLAN.
MP> Enquanto o firebird utilizou: PLAN (PAGAMENTOS NATURAL) PLAN (ASSOCIADOS
MP> NATURAL)
MP> O interbase fez: PLAN (PAGAMENTOS INDEX (RDB$PRIMARY3)) PLAN (ASSOCIADOS
MP> NATURAL)

MP> Alguém tem idéia do que pode estar acontecendo?
MP> Ou alguma idéia pra eu montar um select mais rápido?

MP> Obrigado desde já.
MP> Marcelo Pinto









Mais detalhes sobre a lista de discussão lista