[firebase-br] Ajuda pra montar um SQL mais rápido
Ralhos
ralhos em gmail.com
Qui Fev 21 17:05:16 -03 2008
Troque o left por inner, onde você puder.
no lugar de IN coloque exists e first 1 dentro do select abaixo.
WHERE ( VP2.IDCLIENTE IN( SELECT VP1.IDCLIENTE FROM VENDA_PEDIDO_ITENS VPI1
LEFT JOIN VENDA_PEDIDO VP1 ON (VP1.IDVENDA_PEDIDO
experimente e nos relate o resultado.
Fellipe Henrique escreveu:
Olá amigos, tenho um SQL, porém ele demora muito pra retornar os dados, já
tentei adicionar indices e nada. O que eu quero, é trazer os clientes
ATIVOS, QUE COMPRARAM, UM DETERMINADO PRODUTO em um determinado periodo.
segue o meu SQL, hoje ele demora por volta de uns 2 minutos pra trazer no
máximo uns 10 registros. Se alguém puder me ajudar ficarei extremamente
grato.
Desde já agradeço
Fellipe H.
SQL:
SELECT vp2.data_emissao, vp2.data_faturamento ,
VP2.idvenda_pedido , C.STATUS ,VP2.IDCLIENTE,
C.RAZAO_SOCIAL, prod.idgrupo, prod.idsubgrupo , prod.referencia,
prod.descricao,
vpi.preco_unit, vpi.qnt, vp2.idrepresentante , rep.nome, gru.descricao
as fk_nomegru,
( vpi.preco_unit * vpi.qnt ) as fk_total,
sub.descricao as fk_nomesub,
( SELECT FIRST 1 CC.TELEFONE FROM CLIENTE_CONTATOS CC
WHERE CC.IDCLIENTE = VP2.IDCLIENTE ) AS FK_FONE,
( SELECT FIRST 1 CC.NOME FROM CLIENTE_CONTATOS CC
WHERE CC.IDCLIENTE = VP2.IDCLIENTE ) AS FK_CONTATO ,
C.CIDADE , C.ENDERECO
FROM VENDA_PEDIDO VP2
LEFT JOIN CLIENTE C ON (C.IDCLIENTE = VP2.IDCLIENTE)
LEFT JOIN venda_pedido_itens VPI ON (vpi.idvenda_pedido =
VP2.idvenda_pedido )
LEFT JOIN produto prod ON (prod.idproduto = VPi.idproduto )
LEFT JOIN grupo gru ON ( gru.idgrupo = prod.idgrupo )
LEFT JOIN sub_grupo sub ON ( sub.idsub_grupo = prod.idsubgrupo )
LEFT JOIN representante rep ON ( rep.idrepresentante = vp2.idrepresentante )
WHERE ( VP2.IDCLIENTE IN( SELECT VP1.IDCLIENTE FROM VENDA_PEDIDO_ITENS VPI1
LEFT JOIN VENDA_PEDIDO VP1 ON (VP1.IDVENDA_PEDIDO
= VPI1.IDVENDA_PEDIDO)
LEFT JOIN PRODUTO P1 ON (P1.IDPRODUTO =
VPI1.IDPRODUTO)
WHERE ( VP1.DATA_EMISSAO BETWEEN :PDATA1 AND
:PDATA2 ) )
AND ( C.STATUS = 'A')
AND ( VP2.DATA_EMISSAO BETWEEN :PDATA1 AND :PDATA2 )
Mais detalhes sobre a lista de discussão lista