[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