Select muito lento !

23/11/2005

Ola caros amigos ,


Estou com um problema em um select que executo em meu banco de dados:

SQL.Clear;

SQL.Add(´SELECT DISTINCT ITENS.CODPRODUTO,ITENS.CFOP, PRODUTO.DESCPROD, ITENS.S_TRIB,ITENS.UND,´);
SQL.Add(´ITENS.IPI, ITENS.ICMS,ITENS.REDUCAO_BASE_ICMS, ITENS.DATAMOV, ITENS.BASE_ICMS_SUB´);
SQL.Add(´FROM ITENS,PRODUTO WHERE (ITENS.CODPRODUTO = PRODUTO.CODPRODUTO)and´);
SQL.Add(´DOCUMENTO IN (´);
SQL.Add(´SELECT NFNUMERO FROM NFVENDAS WHERE´);
SQL.Add(´(NFVENDAS.DATAMOV BETWEEN :datahora_ini AND :datahora_fim) AND (´);
SQL.Add(´(MODELO_NF = ´´01´´) OR´);
SQL.Add(´(MODELO_NF = ´´1A´´) OR´);
SQL.Add(´(MODELO_NF = ´´03´´) OR´);
SQL.Add(´(MODELO_NF = ´´06´´) OR´);
SQL.Add(´(MODELO_NF = ´´22´´)))´);

SQL.Add(´union´);

SQL.Add(´SELECT DISTINCT ITENNFC.CODPRODUTO,ITENNFC.CFOP, PRODUTO.DESCPROD, ITENNFC.S_TRIB,ITENNFC.UND,´);
SQL.Add(´ITENNFC.IPI, ITENNFC.ICMS, ITENNFC.REDUCAO_BASE_ICMS, ITENNFC.DATAMOV, ITENNFC.BASE_ICMS_SUB´);
SQL.Add(´FROM ITENNFC, PRODUTO WHERE (ITENNFC.CODPRODUTO = PRODUTO.CODPRODUTO)and´);
SQL.Add(´NFCOMPRA IN (´);
SQL.Add(´SELECT NFNUMERO FROM NF_ENTRADA WHERE´);
SQL.Add(´(DATAENTRADA BETWEEN :datahora_ini AND :datahora_fim) AND (´);
SQL.Add(´(MODELO_NF = ´´01´´) OR´);
SQL.Add(´(MODELO_NF = ´´1A´´) OR´);
SQL.Add(´(MODELO_NF = ´´03´´) OR´);
SQL.Add(´(MODELO_NF = ´´06´´) OR´);
SQL.Add(´(MODELO_NF = ´´22´´)))´);


ParamByName(´datahora_ini´).Asdate := DataHora_Inicial;
ParamByName(´datahora_fim´).Asdate := DataHora_Final;


Uso este select para selecionar a ocorrência de produtos na venda e compra e seleciona apenas uma ocorrência não importa onde.

Só que esta demorando uma eternidade!

Uso Firebird 1.5 e clientedataset


Desde já agradeço


Hugo Fabrício


Hugofab

Respostas

23/11/2005

Emerson

tente assim:
SELECT DISTINCT
  ITENS.CODPRODUTO, ITENS.CFOP, PRODUTO.DESCPROD, ITENS.S_TRIB,
  ITENS.UND, ITENS.IPI, ITENS.ICMS, ITENS.REDUCAO_BASE_ICMS,
  ITENS.DATAMOV, ITENS.BASE_ICMS_SUB 
FROM
  ITENS
INNER JOIN
  NFVENDAS ON (NFVENDAS.NFNUMERO = ITENS.DOCUMENTO
  AND (NFVENDAS.DATAMOV BETWEEN :datahora_ini AND :datahora_fim)
  AND NFVENDAS.MODELO_NF IN (´01´,´1A´,´03´,´06´,´22´))
INNER JOIN
  PRODUTO ON (PRODUTO.CODPRODUTO = ITENS.CODPRODUTO)

union 

SELECT DISTINCT
  ITENNFC.CODPRODUTO, ITENNFC.CFOP, PRODUTO.DESCPROD, ITENNFC.S_TRIB,
  ITENNFC.UND, ITENNFC.IPI, ITENNFC.ICMS, ITENNFC.REDUCAO_BASE_ICMS,
  ITENNFC.DATAMOV, ITENNFC.BASE_ICMS_SUB 
FROM
  ITENNFC
INNER JOIN
  NF_ENTRADA ON (NF_ENTRADA.NFNUMERO = ITENNFC.NFCOMPRA
  AND (NF_ENTRADA.DATAENTRADA BETWEEN :datahora_ini AND :datahora_fim)
  AND NF_ENTRADA.MODELO_NF IN (´01´,´1A´,´03´,´06´,´22´))
INNER JOIN
  PRODUTO ON (PRODUTO.CODPRODUTO = ITENNFC.CODPRODUTO)


lembre-se de criar os indices necessários para a pesquisa:
ITENS (CODPRODUTO, CFOP, S_TRIB, UND, IPI, ICMS,
       REDUCAO_BASE_ICMS, DATAMOV, BASE_ICMS_SUB)
NFVENDAS (NFNUMERO, DATAMOV, MODELO_NF)
PRODUTO (CODPRODUTO)
ITENNFC (CODPRODUTO, CFOP, S_TRIB, UND, IPI, ICMS,
         REDUCAO_BASE_ICMS, DATAMOV, BASE_ICMS_SUB)
NF_ENTRADA (NFNUMERO, DATAENTRADA, MODELO_NF)


uma instrução sql melhor elaborada, juntamente com a criação dos índices necessários, aumentará performance da sua consulta.

agora uma pergunta: na segunda instrução SELECT, quando você avalia a data, o campo de referência da nota é DATAENTRADA, mas é exibido o campo DATAMOV. isso está correto?


Responder Citar

23/11/2005

Hugofab

Emerson.en,


Datamov é na tabela itennfc
Data entrada e na tabela de compras!

Vou fazer as mudanças e ver se fica mais rápido !

Vou verificar também a questões dos índices

Obrigado pela dica!


Responder Citar

23/11/2005

Sanses

Olá

Não sou nenhum expert em bd, mas considero uma alternativa a utilização de uma view bem codificada e com um plan para maximizar o desempenho.

Se falei besteira, me descupem!

[]´s
Sanses


Responder Citar