[firebase-br] Extrema Lentidão em Consulta Firebird 5
Carlos H. Cantu
listas em warmboot.com.br
Quinta Maio 15 08:54:43 -03 2025
O fato de mencionar a mesma tabela em mais de um join, por si só, não é o
problema, desde que o PLAN mostre que um índice apropriado está sendo usado em
ambas as buscas.
No seu caso, ao tirar o segundo join, provavelmente está fazendo com que o PLAN
mude e fique mais eficiente. Vc vai ter que ir testando alterando as ordens dos
joins, usando +0 ou || '' em algumas junções, para tentar fazer com que o
Firebird escolha um plano mais eficiente.
Veja abaixo, o tempo foi muito rapido mesmo com 2 joins na mesma tabela. O PLAN
está eficiente:
Query
------------------------------------------------
select emissao, pn.codprod, pn2.codprod
from notas n
join prodnota pn on pn.id_num = n.id_num
join prodnota pn2 on pn2.id_num = n.id_num -- Repetindo o JOIN
where n.emissao > date '1.10.2024'
Plan
------------------------------------------------
PLAN JOIN (N INDEX (IDX_VENDAS_EMISSAO), PN INDEX (FK_PRODNOTA_NOTAFISCAL), PN2 INDEX (FK_PRODNOTA_NOTAFISCAL))
Query Time
------------------------------------------------
Prepare : 0,00 ms
Execute : 187,00 ms
Avg fetch time: 0,02 ms
Query
------------------------------------------------
select emissao, pn.codprod
from notas n
join prodnota pn on pn.id_num = n.id_num -- APENAS 1 JOIN
where n.emissao > date '1.10.2024'
Plan
------------------------------------------------
PLAN JOIN (N INDEX (IDX_VENDAS_EMISSAO), PN INDEX (FK_PRODNOTA_NOTAFISCAL))
Query Time
------------------------------------------------
Prepare : 0,00 ms
Execute : 62,00 ms
Avg fetch time: 0,01 ms
[]s
Carlos H. Cantu
eBook Guia de Migração para o FB 5 - www.firebase.com.br/guiafb5.php
www.FireBase.com.br - www.firebirdnews.org - blog.firebase.com.br
Lfvl> não pode ser "INNER" tem que ser "LEFT" eu coloquei 2 no caso mais
Lfvl> simples porém tem alguns caso onde tenho até 4 "JOINS" na mesma tabela o
Lfvl> problema é que isso no Postgres roda em segundos como coloquei no 1 email
Lfvl> 15 segundos contra 30 minutos do Firebird
Lfvl> Eu estou achando que isso é um bug no Firebird.
Lfvl> Em quinta-feira, 15 de maio de 2025 às 08:19:17 BRT, Armando Boza
Lfvl> Gonçalves via lista <lista em firebase.com.br> escreveu:
Lfvl>
Lfvl> Bom dia, 2 LEFT JOIN para a mesma tabela?
Lfvl> Eu já tive problemas de desempenho com left join e acabei resolvendo com
Lfvl> UNION, separei os selects e ficou bem rápido.
Lfvl> Faz um teste.
Lfvl> Em 15/05/2025 07:09, Luciano franca via lista escreveu:
>> Acredito que encontrei o problema e não sei como resolver mesmo sem CTE não adianta
>> basta acessar a mesma tabela duas vezes para o Firebird se perder
>> se fizer algo simples como isso já vai dar problemas veja
>>
>> Select
>> Cp.codigo, Cp.nome
>> From cadastro_pessoas cp
>> left join venda v on (v.cod_cliente = cp.codigo) Left join venda v2 on (v2.cod_cliente = cp.codigo) se eu comentar essa segunda junção é excecutado em 1 segundo
>> Group by 1, 2
Mais detalhes sobre a lista de discussão lista