[firebase-br] Ref: SQL Lentíssimo

Alexandre camilo em apollosistemas.com.br
Qui Out 30 11:48:06 -03 2014


Se nao tiver cometido nenhum engano, acho que assim ficará mais rápido a 
sua busca.


SELECT DISTINCT VI2.ID_PRODUTO, P.DESCRICAO, P.ID, V2.ID, VI2.CANCELADO,
SUM(COALESCE(VI2.PRECO_FORNECEDOR,0)) CUSTO,
SUM(COALESCE(VI2.QUANTIDADE,0)) QUANTIDADE,
SUM(COALESCE(VI2.QUANTIDADE,0)) * SUM(COALESCE(VI2.PRECO_FORNECEDOR,0)) 
TOTAL_CUSTO,
SUM(COALESCE(VI2.TOTAL_LIQUIDO,0)) TOTAL_VENDAS,
SUM(COALESCE(VI2.ACRESCIMO_VALOR,0)) + 
SUM(COALESCE(VI2.VALOR_ACRESCIMO_RATEIO,0)) OUTROS_ACRESCIMOS,
SUM(COALESCE(VI2.DESCONTO_VALOR,0)) + 
SUM(COALESCE(VI2.VALOR_DESCONTO_RATEIO,0)) OUTROS_DESCONTOS,
SUM(COALESCE(VI2.VALOR_LUCRO,0)) TOTAL_LUCRO,
SUM( COALESCE(VI2.CUSTO_OPERACIONAL,0) ) TOTAL_CUSTO_OPERACIONAL


FROM VENDA V2 		
	INNER JOIN VENDA_ITENS VI2 ON (VI2.ID_VENDA = V2.ID)
	INNER JOIN PRODUTOS P ON (P.ID = VI2.ID_PRODUTO)
WHERE (V2.ID_EMPRESA = :ID_EMPRESA) AND (V2.DATA_FECHAMENTO BETWEEN 
:DATAINICIAL AND :DATAFINAL)
AND (V2.ID NOT IN (SELECT ID_VENDA FROM DEVOLUCAO WHERE ID_VENDA = V.ID) )
AND (V2.STATUS = 'FCH') AND (V2.CANCELADA = 'N') AND (VI2.CANCELADO = 'N')
GROUP BY VI.ID_PRODUTO, P.DESCRICAO, P.ID, V.ID, VI.CANCELADO
ORDER BY VI.ID_PRODUTO, V.ID





Alexandre Camilo
+55 27 3233-4143

On 30/10/2014 10:11, Omar Marques Haddad wrote:
> Bom dia
>
> Segue o SQL:
>
> SELECT DISTINCT VI.ID_PRODUTO ID, P.DESCRICAO PRODUTO,
>
>
> COALESCE( (SELECT SUM( COALESCE(VI2.PRECO_FORNECEDOR,0) ) FROM VENDA_ITENS
> VI2 JOIN VENDA V2 ON (VI2.ID_VENDA = V2.ID)  JOIN PRODUTOS P2 ON (P2.ID =
> VI2.ID_PRODUTO)
> WHERE (V2.ID_EMPRESA = :ID_EMPRESA) AND (V2.DATA_FECHAMENTO BETWEEN
> :DATAINICIAL AND :DATAFINAL)
> AND (VI2.ID_PRODUTO = VI.ID_PRODUTO)
> AND (V2.ID NOT IN (SELECT ID_VENDA FROM DEVOLUCAO WHERE ID_VENDA = V.ID) )
> AND (V2.STATUS = 'FCH') AND (V2.CANCELADA = 'N') AND (VI2.CANCELADO = 'N'))
> ,0) CUSTO,
>
> COALESCE( (SELECT SUM( COALESCE(VI2.QUANTIDADE,0) ) FROM VENDA_ITENS VI2
> JOIN VENDA V2 ON (VI2.ID_VENDA = V2.ID)  JOIN PRODUTOS P2 ON (P2.ID =
> VI2.ID_PRODUTO)
> WHERE (V2.ID_EMPRESA = :ID_EMPRESA) AND (V2.DATA_FECHAMENTO BETWEEN
> :DATAINICIAL AND :DATAFINAL)
> AND (VI2.ID_PRODUTO = VI.ID_PRODUTO)
> AND (V2.ID NOT IN (SELECT ID_VENDA FROM DEVOLUCAO WHERE ID_VENDA = V.ID) )
> AND (V2.STATUS = 'FCH') AND (V2.CANCELADA = 'N') AND (VI2.CANCELADO = 'N'))
> ,0) QUANTIDADE,
>
>
> COALESCE( (SELECT SUM( COALESCE(VI2.QUANTIDADE,0) ) * SUM(
> COALESCE(VI2.PRECO_FORNECEDOR,0) ) FROM VENDA_ITENS VI2 JOIN VENDA V2 ON
> (VI2.ID_VENDA = V2.ID)  JOIN PRODUTOS P2 ON (P2.ID = VI2.ID_PRODUTO)
> WHERE (V2.ID_EMPRESA = :ID_EMPRESA) AND (V2.DATA_FECHAMENTO BETWEEN
> :DATAINICIAL AND :DATAFINAL)
> AND (VI2.ID_PRODUTO = VI.ID_PRODUTO)
> AND (V2.ID NOT IN (SELECT ID_VENDA FROM DEVOLUCAO WHERE ID_VENDA = V.ID) )
> AND (V2.STATUS = 'FCH') AND (V2.CANCELADA = 'N') AND (VI2.CANCELADO = 'N'))
> ,0) TOTAL_CUSTO,
>
>
> COALESCE( (SELECT SUM( COALESCE(VI2.TOTAL_LIQUIDO,0) ) FROM VENDA_ITENS VI2
> JOIN VENDA V2 ON (VI2.ID_VENDA = V2.ID)  JOIN PRODUTOS P2 ON (P2.ID =
> VI2.ID_PRODUTO)
> WHERE (V2.ID_EMPRESA = :ID_EMPRESA) AND (V2.DATA_FECHAMENTO BETWEEN
> :DATAINICIAL AND :DATAFINAL)
> AND (VI2.ID_PRODUTO = VI.ID_PRODUTO)
> AND (V2.ID NOT IN (SELECT ID_VENDA FROM DEVOLUCAO WHERE ID_VENDA = V.ID) )
> AND (V2.STATUS = 'FCH') AND (V2.CANCELADA = 'N') AND (VI2.CANCELADO = 'N'))
> ,0) TOTAL_VENDAS,
>
>
> COALESCE( (SELECT SUM( COALESCE(VI2.ACRESCIMO_VALOR,0) ) + SUM(
> COALESCE(VI2.VALOR_ACRESCIMO_RATEIO,0) ) FROM VENDA_ITENS VI2 JOIN VENDA V2
> ON (VI2.ID_VENDA = V2.ID)  JOIN PRODUTOS P2 ON (P2.ID = VI2.ID_PRODUTO)
> WHERE (V2.ID_EMPRESA = :ID_EMPRESA) AND (V2.DATA_FECHAMENTO BETWEEN
> :DATAINICIAL AND :DATAFINAL)
> AND (VI2.ID_PRODUTO = VI.ID_PRODUTO)
> AND (V2.ID NOT IN (SELECT ID_VENDA FROM DEVOLUCAO WHERE ID_VENDA = V.ID) )
> AND (V2.STATUS = 'FCH') AND (V2.CANCELADA = 'N') AND (VI2.CANCELADO = 'N'))
> ,0) OUTROS_ACRESCIMOS,
>
>
> COALESCE( (SELECT SUM( COALESCE(VI2.DESCONTO_VALOR,0) ) + SUM(
> COALESCE(VI2.VALOR_DESCONTO_RATEIO,0) ) FROM VENDA_ITENS VI2 JOIN VENDA V2
> ON (VI2.ID_VENDA = V2.ID)  JOIN PRODUTOS P2 ON (P2.ID = VI2.ID_PRODUTO)
> WHERE (V2.ID_EMPRESA = :ID_EMPRESA) AND (V2.DATA_FECHAMENTO BETWEEN
> :DATAINICIAL AND :DATAFINAL)
> AND (VI2.ID_PRODUTO = VI.ID_PRODUTO)
> AND (V2.ID NOT IN (SELECT ID_VENDA FROM DEVOLUCAO WHERE ID_VENDA = V.ID) )
> AND (V2.STATUS = 'FCH') AND (V2.CANCELADA = 'N') AND (VI2.CANCELADO = 'N'))
> ,0) OUTROS_DESCONTOS,
>
>
> COALESCE( (SELECT SUM( COALESCE(VI2.VALOR_LUCRO,0) ) FROM VENDA_ITENS VI2
> JOIN VENDA V2 ON (VI2.ID_VENDA = V2.ID)  JOIN PRODUTOS P2 ON (P2.ID =
> VI2.ID_PRODUTO)
> WHERE (V2.ID_EMPRESA = :ID_EMPRESA) AND (V2.DATA_FECHAMENTO BETWEEN
> :DATAINICIAL AND :DATAFINAL)
> AND (VI2.ID_PRODUTO = VI.ID_PRODUTO)
> AND (V2.ID NOT IN (SELECT ID_VENDA FROM DEVOLUCAO WHERE ID_VENDA = V.ID) )
> AND (V2.STATUS = 'FCH') AND (V2.CANCELADA = 'N') AND (VI2.CANCELADO = 'N'))
> ,0) TOTAL_LUCRO,
>
> COALESCE( (SELECT SUM( COALESCE(VI2.CUSTO_OPERACIONAL,0) ) FROM VENDA_ITENS
> VI2 JOIN VENDA V2 ON (VI2.ID_VENDA = V2.ID)  JOIN PRODUTOS P2 ON (P2.ID =
> VI2.ID_PRODUTO)
> WHERE (V2.ID_EMPRESA = :ID_EMPRESA) AND (V2.DATA_FECHAMENTO BETWEEN
> :DATAINICIAL AND :DATAFINAL)
> AND (VI2.ID_PRODUTO = VI.ID_PRODUTO)
> AND (V2.ID NOT IN (SELECT ID_VENDA FROM DEVOLUCAO WHERE ID_VENDA = V.ID) )
> AND (V2.STATUS = 'FCH') AND (V2.CANCELADA = 'N') AND (VI2.CANCELADO = 'N'))
> ,0) TOTAL_CUSTO_OPERACIONAL
>
> FROM VENDA_ITENS VI
> JOIN VENDA V ON (V.ID = VI.ID_VENDA)
> LEFT JOIN PRODUTOS P ON (P.ID = VI.ID_PRODUTO)
>
> WHERE (V.ID_EMPRESA = :ID_EMPRESA)
>       AND (V.DATA_FECHAMENTO BETWEEN :DATAINICIAL AND :DATAFINAL)
>
> AND V.ID NOT IN (SELECT ID_VENDA FROM DEVOLUCAO WHERE ID_VENDA = V.ID)
> AND (V.STATUS = 'FCH') AND (V.CANCELADA = 'N')
>
>
> GROUP BY VI.ID_PRODUTO, P.DESCRICAO, P.ID, V.ID, VI.CANCELADO ORDER BY
> VI.ID_PRODUTO, V.ID
>
>
> Em 30 de outubro de 2014 08:48, Alexandre <camilo em apollosistemas.com.br>
> escreveu:
>
>> Bom dia,
>>
>> Poste o SQL para que possamos fazer uma análise de como esta sendo feito
>> esta consulta.
>>
>>
>>
>> Alexandre Camilo
>> +55 27 3233-4143
>>
>>
>> On 30/10/2014 09:33, Omar Marques Haddad wrote:
>>
>>> Boa tarde, amigos(as)
>>>
>>>
>>>
>>> Estou tentando montar um SELECT para trazer a lucratividade de todos os
>>> produtos vendidos num período. (Vide anexo).
>>>
>>>
>>>
>>> Estou utilizando FB 2.5.3 / Delphi XE5. É um relatíorio de lucratividade
>>> de
>>> um sistema comercial que prestamos manutenção e suporte;
>>>
>>>
>>>
>>>
>>>
>>> O que acontece: Quando rodo este SELECT no IBExpert, com empresa = 1 e
>>> período: 24/06/2014 a 24/06/2014 (só tem 3 vendas neste dia), o select
>>> roda
>>> de boa no IBExpert.
>>>
>>>
>>>
>>> Porém, ao rodar o mesmo SELECT com empresa = 1 e período: 25/06/2014 a
>>> 25/06/2014 (tem 971 vendas neste dia, fiz um COUNT()), o select trava, o
>>> IBExpert não responde mais.
>>>
>>>
>>>
>>> Pensei em otimizar este SELECT, porém, eu preciso de várias informações
>>> totalizadas da tabela de itens de vendas.
>>>
>>>
>>>
>>> PS: Até criei índice na tabela de vendas, pela empresa + datafechamento,
>>> mas não deu certo. E um detalhe: este relatório pode ser solicitado por um
>>> período bem extenso. Temos um cliente que mexe com hortifrutigranjeiros,
>>> que tem 8 check-out de PDVS vendendo diariamente e gravando vendas e seus
>>> itens;
>>>
>>>
>>>
>>>
>>>
>>> Será que alguém tem alguma dica de como deixar ele otimizado ou melhorado
>>> ?
>>>
>>> Sem mais,
>>>
>>>
>>>
>>> Att.
>>>
>>>
>>>
>>> []´s
>>>
>>>
>>>
>>> *Omar M. Haddad®*
>>>
>>> ( *CLARO* (67) 9188-9220
>>> ______________________________________________
>>> 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://firebase.com.br/pesquisa
>>>
>>>
>> ______________________________________________
>> 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://firebase.com.br/pesquisa
>>
>
>
>




Mais detalhes sobre a lista de discussão lista