Select muito lento !
23/11/2005
0
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
Posts
23/11/2005
Emerson Nascimento
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?
23/11/2005
Hugofab
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!
23/11/2005
Sanses
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
Clique aqui para fazer login e interagir na Comunidade :)