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

Sandro Souza escovadordebits em gmail.com
Qua Maio 13 17:08:13 -03 2009


Bom dia/tarde Marcelo.

Provavelmente, estou falando besteira, mas acredito que o Firebird não
aproveitou o índice da chave primária da tabela de pagamentos porque apenas
o segundo campo do índice (ano_pagamento) foi utilizado.

Só por desencargo de consciência, você poderia criar um índice apenas para
esse segundo campo?

CREATE INDEX IX_PAGAMENTOS_ANO ON PAGAMENTOS(ANO_PAGAMENTO);

E depois executar exatamente o mesmo SELECT e verificar se o plano utilizado
está usando o novo índice?

Espero ter ajudado mais que atrapalhado. :D

2009/5/13 Marcelo Pinto <marcelo.marcelopinto em gmail.com>

>
> 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
>



Mais detalhes sobre a lista de discussão lista