[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