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

Alexandre Pedroso alexgpedroso em gmail.com
Domingo Maio 18 20:16:18 -03 2025


Boa noite. Seria bom fazer um Set Plan On {Query} Set Plan Off para
analisar. Aumentar o cache e o DefaultDbCachePages = 8192, atualizar os
indices SET STATISTICS INDEX (nome_do_indice) e o tamanho da pagina ALTER
DATABASE SET PAGE_SIZE 16384. Tem ferramenta de monitoramento se não me
engano é o Firebird Tables Monitoring {MON$STATEMENTS, MON$IO_STATISTICS}
verifica gargalos, mas tem que rodar a tua query. Mas esta é a parte facil
que talves já tenhas feito. Criar indices ate pra data CREATE INDEX
idx_estoque_data_emissao ON Estoque (data_emissao). Ajuda em alguma coisa.


WITH CADASTRO_PRECO AS (

SELECT GP.COD_PRODUTO, GP.DESCRICAO, GP.FILIAL, GP.ID_PRECO FROM
Cadastro_Precos GP INNER JOIN CADASTRO_MERCADORIAS CM ON (CM.Codigo =
GP.Cod_Produto) WHERE COALESCE(GP.INATIVO, '') IN ('', 'N') ),
Soma_Estoque_1 AS ( SELECT E.Cod_Mercadoria, SUM(E.Quant) Saldo_Tipo FROM
Estoque E INNER JOIN CADASTRO_TIPO_MERCADORIAS CTP ON (CTP.Codigo =
E.Cod_Aplicacao) WHERE COALESCE(E.Lixo, '') <> 'S' AND COALESCE(E.Arquivo,
'') <> 'S' AND E.data_emissao >= '01.12.2024' GROUP BY E.Cod_Mercadoria )
SELECT CAD.MERCADORIA, GP.Descricao, CAD.Codigo, ST1.Saldo_Tipo,
SUM(REL.Quant) Saldo_Total FROM CADASTRO_MERCADORIAS CAD INNER JOIN ESTOQUE
REL ON (REL.Cod_Mercadoria = CAD.Codigo) INNER 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) WHERE
REL.data_emissao >= '01.12.2024' -- Filtro adicional, se aplicável GROUP BY
CAD.MERCADORIA, GP.Descricao, CAD.Codigo, ST1.Saldo_Tipo;

Em qua., 14 de mai. de 2025 às 18:42, Luciano franca via lista <
lista em firebase.com.br> escreveu:

> Esses dois SQL chegam a demorar 15 minutos e 30 minutoscom os mesmo
> índices e registros no PostgreSQL é 15 segundos.
> Percebo extrema lentidão no firebird desde a versão 3 o tempo passou
> estamos na versão 5 e nada mudoumeu sistema consegue trabalhar com dois
> banco de dados Firebird ou Postgres porém tenho vários clientes com
> Firebird que eu não queria mudar para postgres pois se trata de um processo
> complexo onde tenho que instalar uma ferramenta de conversão de dados no
> cliente para fazer a migração.
> Como eu poderia fazer para enviar o banco de dados de produção para os
> criadores do Firebird  pois eu já tentei de todas as formas e não sei mais
> como otimizar acredito ser limitação do Firebird.
>
>             WITH CADASTRO_PRECO As (
> SelectGP.COD_PRODUTO, GP.DESCRICAO,GP.INATIVO,GP.FILIAL, GP.ID_PRECO From
> Cadastro_Precos GPInner Join CADASTRO_MERCADORIAS CM On ( CM.Codigo =
> GP.Cod_Produto ) Where ( GP.INATIVO is Null Or GP.INATIVO = '' Or
> GP.INATIVO = 'N' ) )
> ,Soma_Estoque_1 As ( Select E.Cod_Mercadoria,  Sum(E.Quant)
> Saldo_Tipo From Estoque E Inner Join CADASTRO_TIPO_MERCADORIAS CTP On (
> CTP.Codigo = E.Cod_Aplicacao ) Where (E.Lixo <> 'S' Or E.Lixo is Null Or
> E.Lixo = '') And  ( E.Arquivo <> 'S' Or E.Arquivo is Null Or E.Arquivo = ''
> ) And E.data_emissao >= '01.12.2024' Group By E.Cod_Mercadoria  )
> SELECT CAD.MERCADORIA,GP.Descricao,CAD.Codigo,ST1.Saldo_Tipo,Sum(REL.Quant)
> Saldo_Total
> FROM CADASTRO_MERCADORIAS CAD
> left Join ESTOQUE REL ON (REL.Cod_Mercadoria = CAD.codigo)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 )
> Group By 1, 2, 3, 4
>
>
> //----------------------------------------------------------------------------------------------------------------------------------------------
>
>
> SELECTE.COD_MERCADORIA,E.Mercadoria,E.data_emissao,SUM(E.Quant),
>  ( Select Coalesce(Sum(Coalesce(ES.Quant, 0)), 0) From ESTOQUE ES Where
> (ES.Lixo <> 'S' Or ES.Lixo is Null Or ES.Lixo = '') And  ( ES.Arquivo <>
> 'S' Or ES.Arquivo is Null Or ES.Arquivo = '' )  And ES.Cod_Mercadoria =
> E.Cod_Mercadoria And ES.data_emissao <= E.data_emissao  And  (( ES.FILIAL =
> 0 Or ES.FILIAL Is Null ) OR  ES.FILIAL = 1   ) ) As SALDO_DIARIO
> FROM ESTOQUE E INNER Join CADASTRO_MERCADORIAS CM on (CM.Codigo =
> E.COD_MERCADORIA )
> Where (E.Lixo <> 'S' Or E.Lixo is Null Or E.Lixo = '')And  ( E.Arquivo <>
> 'S' Or E.Arquivo is Null Or E.Arquivo = '' ) And ( (( CM.Estoque_Filial is
> Not Null And CM.Estoque_Filial <> 0 ) And (CM.Estoque_Filial = E.Filial)
> And E.Filial = 1 ) Or( CM.Estoque_Filial is Null Or CM.Estoque_Filial = 0 )
> )
> Group By  1, 2, 3Having SUM(E.Quant) <> 0Order By E.COD_MERCADORIA,
> E.Data_Emissao Desc
>
> ______________________________________________
> 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://www.firebase.com.br/pesquisa_lista.html
>


Mais detalhes sobre a lista de discussão lista