[firebase-br] Extrema Lentidão em Consulta Firebird 5

Rodrigo Gomes da Silva rodrgomes em gmail.com
Sexta Maio 16 18:41:38 -03 2025


Sentença ruim pacas... coloque uma sentença valida que é mais facil de
analisar...

Aonde trabalho nos usamos firebird e postgresql. O sistema era feito
somente com firebird, e passamos a converter ele para funcionar nos 2
sistemas. Bancos com dados de 1gb a 300gb (1 deles tem 3tb mas é de
arquivos binários). Diversas sentenças rodavam mais rapidas no firebird que
tiveram de ser alteradas para rodar melhor no postgresql, aonde o mesmo
banco convertido do firebird ficava bem mais lento, e o contrário é
verdadeiro tb.

Cada banco tem suas particularidades, e uma do postgresql é que é dificil
medir tempo individual de sentença pois ele faz algum tipo de cache de
resultados aonde uma sentença pode demorar, mas se vc tentar rodar ela
denovo vai rapido pq o PG fez algum cache não dos dados, e sim de algo
relacionado com o resultado ou filtro.

Por tudo que ja tivemos de problema com lentidão de sentença, a sua de
exemplo basico vai ficar lenta mesmo, pq esta multiplicando o numero de
registros da 1a com o da 2a...

Olhando a sua sentenca do 1o post, uma coisa que pode ser q deixe ela lenta
é que o firebird pode estar processando os 2 with todos registros de
estoque que vc ta agrupando... você pode resolver isso fazendo uma subquery
1o depois fazer a contagem da quantidade... tenta mantendo o mesmos with
(soma_estoque_1 e cadastro_preco) e use o select principal como

SELECT SUB.MERCADORIA, SUB.Descricao, SUB.Codigo, SUB.Saldo_Tipo,
SUM(REL.Quant) as Saldo_Total
FROM
  (SELECT
    CAD.MERCADORIA,
    GP.Descricao,
    CAD.Codigo,
    ST1.Saldo_Tipo
   FROM
    CADASTRO_MERCADORIAS CAD
    LEFT JOIN CADASTRO_PESSOAS CF ON CF.Codigo = CAD.cod_fornecedor
    LEFT JOIN CADASTRO_PRECO GP ON GP.Cod_Produto = REL.Cod_Mercadoria AND
GP.ID_Preco = REL.ID_Preco
    LEFT JOIN Soma_Estoque_1 ST1 ON ST1.Cod_Mercadoria = REL.Cod_Mercadoria
   ) SUB
  LEFT JOIN ESTOQUE REL ON REL.Cod_Mercadoria = SUB.Codigo
GROUP BY
    SUB.MERCADORIA,
    SUB.Descricao,
    SUB.Codigo,
    SUB.Saldo_Tipo


Fiz no bloco de notas, então poderia ter algum erro ai, mas a ideia deve
ter dado para perceber...

On Fri, May 16, 2025 at 5:39 PM Luciano franca <luapfirebird em yahoo.com.br>
wrote:

> Eu Fiz apenas um exemplo basico onde dois "LEFT Join" causam extrema
> lentidão no Firebird meu SQL completo.
> Veja esse topico para entender melhor
>
> https://github.com/FirebirdSQL/firebird/issues/8568
>
>
>
>
>
>
> Em sexta-feira, 16 de maio de 2025 às 15:48:49 BRT, Rodrigo Gomes da Silva
> <rodrgomes em gmail.com> escreveu:
>
>
> SELECT
> CM.Codigo,
> CM.MERCADORIA,
> Sum(E.quant) As Saldo,
> AVG(E2.preco_custo) As Preco
> FROM CADASTRO_MERCADORIAS CM
> left Join ESTOQUE E ON (E.Cod_Mercadoria = CM.codigo)
> left Join ESTOQUE E2 ON ( E2.Cod_Mercadoria = CM.Codigo )
> Group By 1, 2
>
> Você quer o preço medio e a quantidade, por que esta fazendo 2 joins para
> o mesmo filtro? Os registros são multiplicados.
>
> SELECT
> CM.Codigo,
> CM.MERCADORIA,
> Sum(E.quant) As Saldo,
> AVG(E.preco_custo) As Preco
>
> FROM CADASTRO_MERCADORIAS CM
> left Join ESTOQUE E ON (E.Cod_Mercadoria = CM.codigo)
> Group By 1, 2
>
>
> Aparentemente bastaria fazer isso.
>


Mais detalhes sobre a lista de discussão lista