[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