Ajuda pra montar um SQL mais rápido

Fellipe Henrique fellipe.h em uol.com.br
Qui Fev 21 16:35:14 -03 2008


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 )


As tabelas principais:

CREATE TABLE VENDA_PEDIDO (
    IDVENDA_PEDIDO     INTEGER NOT NULL,
    DATA_CADASTRO      DATE NOT NULL,
    DATA_EMISSAO       DATE NOT NULL,
    DATA_FATURAMENTO   DATE,
    HORA_FATURAMENTO   TIME,
    PROGRAMADO         CHAR(1) COLLATE PXW_INTL850,
    STATUS             CHAR(1) NOT NULL COLLATE PXW_INTL850,
    TIPO_PEDIDO        CHAR(1) COLLATE PXW_INTL850,
    TIPO_NOTA          CHAR(1) COLLATE PXW_INTL850,
    IDCLIENTE          INTEGER NOT NULL,
    IDFUNCIONARIO      INTEGER,
    IDREPRESENTANTE    INTEGER,
    IDVENCIMENTO       INTEGER,
    IDCFOP             INTEGER,
    IDBANCO            INTEGER,
    IDTRANPORTADORA    INTEGER,
    TRANS_TIPOFRETE    SMALLINT,
    TRANS_VOL_QNT      D_QNT,
    TRANS_VOL_ESPECIE  VARCHAR(10) COLLATE PXW_INTL850,
    TRANS_VOL_MARCA    VARCHAR(10) COLLATE PXW_INTL850,
    TRANS_VOL_NUM      VARCHAR(10) COLLATE PXW_INTL850,
    TRANS_VOL_PESOBRU  D_QNT,
    TRANS_VOL_PESOLIQ  D_QNT,
    TRANS_IDMENSAGEM   INTEGER,
    TRANS_MENSAGEM     BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PERC_DESC          D_DINHEIRO NOT NULL,
    VLR_DESC           D_DINHEIRO NOT NULL,
    PERC_ACREC         D_DINHEIRO NOT NULL,
    VLR_ACREC          D_DINHEIRO NOT NULL,
    VLR_BASE_CALC      D_DINHEIRO,
    VLR_BASE_ST        D_DINHEIRO,
    VLR_ICMS_ST        D_DINHEIRO,
    VLR_ICMS           D_DINHEIRO,
    VLR_PRODUTO        D_DINHEIRO NOT NULL,
    VLR_TOTAL          D_DINHEIRO NOT NULL,
    QNT_TOTAL_PROD     INTEGER,
    ENTR_LOGRADOURO    D_ENDERECO,
    ENTR_BAIRRO        D_BAIRRO,
    ENTR_CIDADE        D_CIDADE,
    ENTR_CEP           D_CEP,
    ENTR_UF            CHAR(2) COLLATE PXW_INTL850,
    ENTR_PONTOREF      D_DESCRICAO,
    FRETE              D_DINHEIRO,
    SEGURO             D_DINHEIRO,
    OUTRAS_DESP        D_DINHEIRO,
    PERC_COMISSAO      D_DINHEIRO,
    VLR_COMISSAO       D_DINHEIRO,
    MAO_OBRA           D_DINHEIRO,
    PERC_ISS           D_DINHEIRO,
    VLR_ISS            D_DINHEIRO,
    IPI                D_DINHEIRO,
    OBS                BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    IDCAIXA            INTEGER,
    IDCONTA_RECEBER    INTEGER,
    FRENTE_CAIXA       SMALLINT,
    TIPO_FRETE         SMALLINT,
    NUM_NOTA           VARCHAR(10) COLLATE PXW_INTL850,
    TOTAL_PRECO_CUSTO  D_DINHEIRO,
    PERC_LUCRO         D_DINHEIRO,
    IDCFOP_SERV        INTEGER,
    IDPEDIDO_INTERNO   INTEGER,
    MARCAPEDIDO        VARCHAR(1)
);


CREATE TABLE VENDA_PEDIDO_ITENS (
    IDVENDA_PEDIDO_ITENS        INTEGER NOT NULL,
    IDVENDA_PEDIDO              INTEGER NOT NULL,
    IDPRODUTO                   INTEGER NOT NULL,
    IDCFOP                      INTEGER,
    PEDIDO_PROGRAMADO           CHAR(1) COLLATE PXW_INTL850,
    QNT                         D_QNT NOT NULL,
    QNT_PENDENTE                D_QNT,
    QNT_DEVOLVIDA               D_QNT,
    PRECO_UNIT                  D_DINHEIRO NOT NULL,
    PRECO_CUSTO                 D_DINHEIRO,
    PERC_DESC                   D_DINHEIRO,
    VLR_DESC                    D_DINHEIRO,
    PERC_ACREC                  D_DINHEIRO,
    VLR_ACREC                   D_DINHEIRO,
    VALOR_TOTAL                 D_DINHEIRO NOT NULL,
    SI_PERC_BASE_CALC           D_DINHEIRO,
    SI_VLR_BASE_CALC            D_DINHEIRO,
    SI_FRETE                    D_DINHEIRO,
    SI_SEGURO                   D_DINHEIRO,
    SI_OUTRAS_DESP              D_DINHEIRO,
    SI_MAO_OBRA                 D_DINHEIRO,
    SI_VLR_ICMS                 D_DINHEIRO,
    SI_VLR_DESC                 D_DINHEIRO,
    SI_VLR_ACREC                D_DINHEIRO,
    SI_VLR_IPI                  D_DINHEIRO,
    SI_ALIQUOTA                 D_DINHEIRO,
    SI_CST                      CHAR(3) COLLATE PXW_INTL850,
    SI_COD_TRIB                 CHAR(1) COLLATE PXW_INTL850,
    SI_NUM_ITEM                 SMALLINT,
    SI_ST_ALIQ                  D_DINHEIRO,
    SI_ST_BASE                  D_DINHEIRO,
    SI_ST_ICMS                  D_DINHEIRO,
    ULT_CUSTO_MEDIO_PROD        D_DINHEIRO,
    PRECO_CUSTO_MEDIO           D_DINHEIRO,
    PERC_COMIS_PROD             D_DINHEIRO,
    VLR_COMIS_PROD              D_DINHEIRO,
    IDCOD_TRIBUTARIO_ALIQUOTAS  INTEGER
);




/******************************************************************************/
/****                             Primary Keys 
****/
/******************************************************************************/

ALTER TABLE VENDA_PEDIDO ADD CONSTRAINT PK_VENDA_PEDIDO PRIMARY KEY 
(IDVENDA_PEDIDO);
ALTER TABLE VENDA_PEDIDO_ITENS ADD CONSTRAINT PK_VENDA_PEDIDO_ITENS PRIMARY 
KEY (IDVENDA_PEDIDO_ITENS);


/******************************************************************************/
/****                             Foreign Keys 
****/
/******************************************************************************/

ALTER TABLE VENDA_PEDIDO ADD CONSTRAINT FK_VENDA_PEDIDO_1 FOREIGN KEY 
(IDCLIENTE) REFERENCES CLIENTE (IDCLIENTE);
ALTER TABLE VENDA_PEDIDO ADD CONSTRAINT FK_VENDA_PEDIDO_2 FOREIGN KEY 
(IDREPRESENTANTE) REFERENCES REPRESENTANTE (IDREPRESENTANTE);
ALTER TABLE VENDA_PEDIDO ADD CONSTRAINT FK_VENDA_PEDIDO_3 FOREIGN KEY 
(IDVENCIMENTO) REFERENCES VENCIMENTO (IDVENCIMENTO);
ALTER TABLE VENDA_PEDIDO ADD CONSTRAINT FK_VENDA_PEDIDO_4 FOREIGN KEY 
(IDCFOP) REFERENCES CFOP (IDCFOP);
ALTER TABLE VENDA_PEDIDO ADD CONSTRAINT FK_VENDA_PEDIDO_5 FOREIGN KEY 
(IDTRANPORTADORA) REFERENCES TRANSPORTADORA (IDTRANSPORTADORA);
ALTER TABLE VENDA_PEDIDO ADD CONSTRAINT FK_VENDA_PEDIDO_6 FOREIGN KEY 
(IDFUNCIONARIO) REFERENCES FUNCIONARIO (IDFUNCIONARIO);
ALTER TABLE VENDA_PEDIDO ADD CONSTRAINT FK_VENDA_PEDIDO_7 FOREIGN KEY 
(TRANS_IDMENSAGEM) REFERENCES MENSAGEM (IDMENSAGEM);
ALTER TABLE VENDA_PEDIDO ADD CONSTRAINT FK_VENDA_PEDIDO_8 FOREIGN KEY 
(IDCFOP_SERV) REFERENCES CFOP (IDCFOP);
ALTER TABLE VENDA_PEDIDO_ITENS ADD CONSTRAINT FK_VENDA_PEDIDO_ITENS_1 
FOREIGN KEY (IDVENDA_PEDIDO) REFERENCES VENDA_PEDIDO (IDVENDA_PEDIDO) ON 
DELETE CASCADE;
ALTER TABLE VENDA_PEDIDO_ITENS ADD CONSTRAINT FK_VENDA_PEDIDO_ITENS_2 
FOREIGN KEY (IDPRODUTO) REFERENCES PRODUTO (IDPRODUTO);
ALTER TABLE VENDA_PEDIDO_ITENS ADD CONSTRAINT FK_VENDA_PEDIDO_ITENS_3 
FOREIGN KEY (IDCOD_TRIBUTARIO_ALIQUOTAS) REFERENCES COD_TRIBUTARIO_ALIQUOTAS 
(IDCOD_TRIBUTARIO_ALIQUOTAS); 







Mais detalhes sobre a lista de discussão lista