Melhorar performance - SQL

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
einstein18
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 24 Jan 2008 7:16 am
Localização: SP

Olá galera, tenho um select com 2 subselects e o mesmo está demorando alguns minutos para me retornar as informações, gostaria de saber se alguém tem alguma alternativa para fazer o mesmo que o SQL abaixo faz:

Tenho 3 tabelas:

- ESTPRO = Cadastro de Produto
- ESTLOC = Local de Estoque
- ESTHIS = Histórico do Produto(como se fosse um kardex)

Preciso trazer desta tabela ESTHIS, o registro referênte a última movimentação anterior a uma certa data que eu passo como parâmetro, ou seja, o max(ordem) de uma data que seja menor a data que eu passei no parâmetro.

Selecionar tudo

SELECT DISTINCT ESTPRO.PRODUTO , 
          ESTLOC.LOCAL , 
          ESTHIS.SALDO , 
          ESTHIS.CUSTOM
     FROM ESTPRO , ESTLOC , ESTHIS
    WHERE ESTPRO.PRODUTO = ESTLOC.PRODUTO AND
          ESTHIS.PRODUTO = ESTPRO.PRODUTO AND
          ESTHIS.LOCAL = ESTLOC.LOCAL     AND
          ESTHIS.DATA <= '30/04/2008'     AND
          ESTHIS.ORDEM = ( SELECT MAX ( A.ORDEM ) 
                             FROM ESTHIS A
                            WHERE DATA = ( SELECT MAX ( B.DATA ) 
                                             FROM ESTHIS B
                                            WHERE B.DATA <= '30/04/2008'     AND 
                                                  B.PRODUTO = ESTPRO.PRODUTO AND 
                                                  B.LOCAL = ESTLOC.LOCAL )   AND 
                                  A.PRODUTO = ESTPRO.PRODUTO AND 
                                  A.LOCAL = ESTLOC.LOCAL     AND
                                  A.DATA = ESTHIS.DATA);
Caso alguém tenha alguma sugestão eu agradeço,

Obrigado,

Renato
einstein18
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 24 Jan 2008 7:16 am
Localização: SP

Olá Pessoal, consegui resolver, o problema era no 2 subselect. Ao invés dele se referenciar ao subselect anterior, ele estava se referenciando ao select principal.. ai demorava demais.

agora o select ficou assim:

Selecionar tudo

SELECT DISTINCT ESTPRO.PRODUTO , 
          ESTLOC.LOCAL , 
          ESTHIS.SALDO , 
          ESTHIS.CUSTOM
     FROM ESTPRO , ESTLOC , ESTHIS
    WHERE ESTPRO.PRODUTO = ESTLOC.PRODUTO AND
          ESTHIS.PRODUTO = ESTPRO.PRODUTO AND
          ESTHIS.LOCAL = ESTLOC.LOCAL     AND
          ESTHIS.DATA <= '30/04/2008'     AND
          ESTHIS.ORDEM = ( SELECT MAX ( A.ORDEM ) 
                             FROM ESTHIS A
                            WHERE DATA  = ( SELECT MAX ( B.DATA ) 
                                             FROM ESTHIS B
                                            WHERE B.DATA <= '30/04/2008'     AND 
                                                  B.PRODUTO = A.PRODUTO AND 
                                                  B.LOCAL = A.LOCAL )   AND 
                                  A.PRODUTO = ESTPRO.PRODUTO AND 
                                  A.LOCAL = ESTLOC.LOCAL     AND
                                  A.DATA = ESTHIS.DATA);
Abraços,

Renato
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 10 visitantes