[firebase-br] Ref: SQL Lentíssimo

Omar Marques Haddad omarhaddadm em gmail.com
Qui Out 30 10:11:18 -03 2014


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
>



-- 
Att.
Omar Marques Haddad
Analista de Sistemas Sênior



Mais detalhes sobre a lista de discussão lista