[firebase-br] Interbase rápido x Firebird muito lento. Me ajudem com esse problema por favor.
Sandro Souza
escovadordebits em gmail.com
Qui Maio 14 12:09:32 -03 2009
Bom dia/tarde Marcelo.
Pois é grande Marcelo, e o pior é que nem iria adiantar criar aquele índice
que eu sugeri.
Mesmo sabendo que a seletividade daquele índice poderia não ser a ideal, a
minha intenção era a de fornecer algum índice que acelerasse aquela
consulta, mas mesmo assim não iria adiantar em nada, já que os operadores IN
e NOT IN não usam índice algum.
Outra vantagem de ter resolvido pelo NOT EXISTS foi que você não necessitou
criar índice extra algum. Só precisou reorganizar o SELECT e funcionou como
você desejava.
No mínimo, foi muito bom ver que os participantes desse fórum estão bastante
ativos, e só temos a agradecer a todos eles pelos esclarecimentos que nos
deram.
Valeu mesmo pessoal. :D
2009/5/14 Marcelo Pinto <marcelo.marcelopinto em gmail.com>
> Sandro realmente acho q aconteceu isso q vc falou, ele não aproveitou o
> índice.
> Eu ia criar o índice como vc sugeriu, mas consegui fazer utilizando o not
> exists como o pessoal do news falou.
>
> Valeu pela atenção.
> [[]]'s
> Marcelo Pinto.
>
> 2009/5/13 Sandro Souza <escovadordebits em gmail.com>
>
> 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