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

Carlos H. Cantu listas em warmboot.com.br
Quarta Maio 14 20:47:50 -03 2025


A primeira coisa é vc analisar o PLAN gerado pela consulta, e a partir dele 
tentar otimizar.

PS: Dependendo dos casos, o uso de CTEs pode ficar extremamente lento
(especialmente quando há funções de agregação nelas). Em último caso, transforme
tudo em um execute block com multiplos selects dentro do loop principal.

[]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> Esses dois SQL chegam a demorar 15 minutos e 30 minutoscom os mesmo
Lfvl> índices e registros no PostgreSQL é 15 segundos.
Lfvl> Percebo extrema lentidão no firebird desde a versão 3 o tempo passou
Lfvl> estamos na versão 5 e nada mudoumeu sistema consegue trabalhar com dois
Lfvl> banco de dados Firebird ou Postgres porém tenho vários clientes com
Lfvl> Firebird que eu não queria mudar para postgres pois se trata de um
Lfvl> processo complexo onde tenho que instalar uma ferramenta de conversão de
Lfvl> dados no cliente para fazer a migração.
Lfvl> Como eu poderia fazer para enviar o banco de dados de produção para os
Lfvl> criadores do Firebird  pois eu já tentei de todas as formas e não sei mais
Lfvl> como otimizar acredito ser limitação do Firebird.

Lfvl>             WITH CADASTRO_PRECO As ( SelectGP.COD_PRODUTO,
Lfvl> GP.DESCRICAO,GP.INATIVO,GP.FILIAL, GP.ID_PRECO From Cadastro_Precos
Lfvl> GPInner Join CADASTRO_MERCADORIAS CM On ( CM.Codigo = GP.Cod_Produto )
Lfvl> Where ( GP.INATIVO is Null Or GP.INATIVO = '' Or GP.INATIVO = 'N' ) )
Lfvl> ,Soma_Estoque_1 As ( Select E.Cod_Mercadoria,  Sum(E.Quant) Saldo_Tipo
Lfvl> From Estoque E Inner Join CADASTRO_TIPO_MERCADORIAS CTP On ( CTP.Codigo =
Lfvl> E.Cod_Aplicacao ) Where (E.Lixo <> 'S' Or E.Lixo is Null Or E.Lixo = '')
Lfvl> And  ( E.Arquivo <> 'S' Or E.Arquivo is Null Or E.Arquivo = '' ) And
Lfvl> E.data_emissao >= '01.12.2024' Group By E.Cod_Mercadoria  )
Lfvl> SELECT
Lfvl> CAD.MERCADORIA,GP.Descricao,CAD.Codigo,ST1.Saldo_Tipo,Sum(REL.Quant) Saldo_Total
Lfvl> FROM CADASTRO_MERCADORIAS CAD 
Lfvl> left Join ESTOQUE REL ON (REL.Cod_Mercadoria = CAD.codigo)left join
Lfvl> CADASTRO_PESSOAS CF on (CF.Codigo = CAD.cod_fornecedor )left join
Lfvl> Cadastro_Preco GP ON (GP.cod_produto = REL.Cod_Mercadoria  And GP.ID_Preco
Lfvl> = REL.ID_Preco  )Left Join Soma_Estoque_1 ST1 on (ST1.Cod_Mercadoria = REL.Cod_Mercadoria )
Lfvl> Group By 1, 2, 3, 4

Lfvl> //----------------------------------------------------------------------------------------------------------------------------------------------


Lfvl> SELECTE.COD_MERCADORIA,E.Mercadoria,E.data_emissao,SUM(E.Quant),
Lfvl>  ( Select Coalesce(Sum(Coalesce(ES.Quant, 0)), 0) From ESTOQUE ES Where
Lfvl> (ES.Lixo <> 'S' Or ES.Lixo is Null Or ES.Lixo = '') And  ( ES.Arquivo <>
Lfvl> 'S' Or ES.Arquivo is Null Or ES.Arquivo = '' )  And ES.Cod_Mercadoria =
Lfvl> E.Cod_Mercadoria And ES.data_emissao <= E.data_emissao  And  (( ES.FILIAL
Lfvl> = 0 Or ES.FILIAL Is Null ) OR  ES.FILIAL = 1   ) ) As SALDO_DIARIO
Lfvl> FROM ESTOQUE E INNER Join CADASTRO_MERCADORIAS CM on (CM.Codigo = E.COD_MERCADORIA )
Lfvl> Where (E.Lixo <> 'S' Or E.Lixo is Null Or E.Lixo = '')And  ( E.Arquivo <>
Lfvl> 'S' Or E.Arquivo is Null Or E.Arquivo = '' ) And ( (( CM.Estoque_Filial is
Lfvl> Not Null And CM.Estoque_Filial <> 0 ) And (CM.Estoque_Filial = E.Filial)
Lfvl> And E.Filial = 1 ) Or( CM.Estoque_Filial is Null Or CM.Estoque_Filial = 0 ) )
Lfvl> Group By  1, 2, 3Having SUM(E.Quant) <> 0Order By E.COD_MERCADORIA, E.Data_Emissao Desc

Lfvl> ______________________________________________
Lfvl> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Lfvl> Para saber como gerenciar/excluir seu cadastro na lista, use:
Lfvl> http://www.firebase.com.br/fb/artigo.php?id=1107
Lfvl> Para consultar mensagens antigas: http://www.firebase.com.br/pesquisa_lista.html




Mais detalhes sobre a lista de discussão lista