[firebase-br] Consulta Muito, Muito Lenta
Felipe Giotto
felipe em metasoftware.com.br
Sex Jul 29 18:04:53 -03 2005
Eu não estou com uma "visão" muito boa desse select, mas você pode
tentar adaptar esse SQL para o que você precisa:
SELECT ME.STATUS AS STATUS, 0.0 AS ENTRADAS, SUM(ME.QUANTIDADE) AS SAIDAS
FROM MOVIESTOQUE ME
WHERE ME.STATUS='P'
GROUP BY ME.STATUS
UNION
SELECT ME.STATUS AS STATUS, SUM(ME.QUANTIDADE) AS ENTRADAS, 0.0 AS SAIDAS
FROM MOVIESTOQUE ME
WHERE ME.STATUS='I'
GROUP BY ME.STATUS
Dessa forma você calcularia dois selects "independentes", um para as
entradas (com o valor zero nas saídas) e outro para as saídas (com valor
zero nas entradas) e retornaria os dois unidos em um só dataset. Eu sei
que não é exatamente isso que você precisa, mas você pode alterar um
pouco esse select para conseguir os dados corretos...
Espero ter ajudado,
Felipe Giotto ;-)
eduardo escreveu:
> Olá Valdir Dill
>
>> SELECT P.CODIGO, P.DESCRICAO, P.UNIDADE, P.MARCA, P.ESTOQUEMINIMO,
>> P.ATUAL,
>> CASE ME.OPERACAO WHEN 'E' THEN SUM(ME.QUANTIDADE) END AS ENTRADAS,
>> CASE ME.OPERACAO WHEN 'S' THEN SUM(ME.QUANTIDADE) END AS SAIDAS
>
> Acho que estes CASEs, considerando que são agregados estão
> dificultando as coisas pro banco.
> Experimente assim:
>
> SUM(CASE WHEN ME.OPERACAO='E' THEN ME.QUANTIDADE ELSE 0 END) AS ENTRADAS,
> SUM(CASE WHEN ME.OPERACAO='S' THEN ME.QUANTIDADE ELSE 0 END) AS SAIDAS,
>
>> FROM PRODUTOS P
>> LEFT JOIN MOVIESTOQUE ME ON (ME.PRODUTO = P.CODIGO
>
>
>> AND ME.DATA >:VDataPosicao)
>
>
> Os JOINS devem, preferencialmente ter uma relação de 1 para 1. Esta
> parte iria melhor no WHERE
> WHERE ME.DATA >:VDataPosicao)
>
>> GROUP BY
>> P.CODIGO, P.DESCRICAO, P.UNIDADE, P.MARCA, P.ESTOQUEMINIMO, P.ATUAL,
>> ME.OPERACAO
>
>
> Algumas vezes, subselects trazem vantagens sobre o Agrupamento,
> principalmente no seu caso onde a quantidade de datas armazenadas pode
> ser bem maior dos que a do período que você quer.
>
> Você poderia tentar algo como:
>
> SELECT DISTINCT
> P.CODIGO, P.DESCRICAO, P.UNIDADE, P.MARCA, P.ESTOQUEMINIMO, P.ATUAL,
> SELECT(
> SUM(QUANTIDADE)
> FROM MOVIESTOQUE
> WHERE PRODUTO = P.CODIGO
> AND DATA>:VDataPosicao
> AND OPERACAO='E'
> ) AS ENTRADAS,
> SELECT(
> SUM(QUANTIDADE)
> FROM MOVIESTOQUE
> WHERE PRODUTO = P.CODIGO
> AND DATA>:VDataPosicao
> AND OPERACAO='S'
> ) AS SAIDAS
> FROM PRODUTOS P
>
> Um índice em PRODUTO, DATA na tabela MOVIESTOQUE vai otimizar o
> resultado em ambos os casos
>
>> Se o cadastro de produtos tiver mais que 2500 itens, chega a demorar
>> mais de 5 minutos para abrir. Por que será tanta demora? Alguém teria
>> alguma sugestão para fazer essa consulta de forma diferente e que fosse
>> mais rápida?
>>
>> Utilizo Firebird 1.5
>
>
> Você precisa acesso bidirecional?
> Componentes unidirecionais são mais rápidos para grandes volumes, pois
> dão fetch sob demanda. Se precisar ser bidirecional, ainda assim você
> pode usar a propriedade PackedRecords e trazer em "Blocos" de 20 ou 30
> registros, o que também melhora a performance inicial.
>
> Espero ter ajudado
>
> Forte Abraço, Eduardo
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>
--
Felipe Luiz Christófolli Giotto
Meta Tecnologia em Software, Ltda
Mais detalhes sobre a lista de discussão lista