[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