[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