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