Re: [firebase-br] Extrema Lentidão em Consulta Firebi rd 5
Rodrigo Gomes da Silva via lista <[email protected]> Fri, 16 May 2025 18:41:38 -0300
| Newsgroups | gmane.comp.db.firebase.portuguese |
|---|---|
| Message-ID | <CAJ2k39A2a3uu-Zumf+D9B29Csv4sN12mmH=FBd=1Ocm-o0-8Uw@mail.gmail.com> |
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 <[email protected]>
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
> <[email protected]> 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.
>
______________________________________________
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