Melhorar performance - SQL

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Sex, 30 Mai 2008 9:56 am

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.

Código: Selecionar todos
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
Localização: SP

Mensagemem Sex, 30 Mai 2008 10:55 am

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:

Código: Selecionar todos
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
einstein18
Localização: SP


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


      Voltar para SQL

      Quem está online

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