none
performance de consulta RRS feed

  • Pergunta

  • Pessoal,

    Esta consulta esta bastante lenta no meu banco. Gostaria, se possível, de alguma sugestão para melhorar a performance:

     select saldo+quantidade as saldoatual,case when valoranterior is null then 0 else VALORANTERIOR end as valoranterior,*
         from (select case when saldoprev is null then 0 else saldoprev end as saldo,
         *,case when valorantigo is null then 0 else valorantigo end as antigo
         from (
         select distinct tt.nseqitmmov,tt.idprd,codigoreduzido,nomefantasia,preco1 as aprazo,
         case when qtdeentrada is null then tt.quantidade * TUND.FATORCONVERSAO else tr.qtdeentrada END as quantidade,
         case when tr.custoreposicaoa is null then tp.CUSTOREPOSICAO else tr.CUSTOREPOSICAOA end as precocheio,
         preco1,margembrutalucro,tp.custounitario,
         case when prdcesta is null then 'NÃO' else prdcesta end as prdcesta
        
         ,case when prdexterno is null then 'NÃO' else prdexterno end as prdexterno
         ,(select top 1 valoranterior from  historicoprecosprodutos where idprd = tp.idprd
         and idreajustepreco <= (select top 1 idreajustepreco from historicoprecosprodutos where idprd = tp.idprd order by idreajustepreco desc)order by idreajustepreco desc) as valoranterior
         ,(select top 1 novovalor from  historicoprecosprodutos where idprd = tp.idprd
         and idreajustepreco <= (select top 1 idreajustepreco from historicoprecosprodutos where idprd = tp.idprd order by idreajustepreco desc)order by idreajustepreco desc) as valorantigo
         ,prodpdv,libsaldo,codcfo, SALDOANTERIOR as saldoprev,tpcp.matlimp,ttb.VALOR as IPI
         from tmov t WITH (NOLOCK)
         inner join titmmov tt (NOLOCK)  on (tt.idmov = t.idmov)
         left join TUND (NOLOCK) on (TUND.CODUND = TT.CODUND)
         left join TRELSLD tr on (tr.IDMOV = tt.IDMOV and tt.NSEQITMMOV = tr.NSEQITMMOV)
         inner join tprd tp (NOLOCK)  on (tp.idprd = tt.idprd)
         left join tprdcompl tpcp (NOLOCK)  on (tp.idprd = tpcp.idprd)
         left join ttrbprd ttp (NOLOCK)  on(ttp.idprd = tp.idprd)
         left join TTRBMOV ttb (NOLOCK) on (ttb.IDMOV = tt.IDMOV and ttb.NSEQITMMOV = tt.NSEQITMMOV)

         where substring(t.codtmv,1,1) = '1' and ttb.codtrb = 'IPI'

       
         and t.numeromov = '000002470'
       
        
        
          and t.codfilial = '1'
        
        
         )TGERAL )TGERAL2 order by nseqitmmov

    terça-feira, 13 de agosto de 2013 15:55

Todas as Respostas

  • Todas as suas tabelas que fazem join contem indice ? voce chegou a verificar como esta a fragmentação dos mesmos ? como esta o plano de execução ? algum gargalo ?

    Alexandre Matayosi Conde Mauricio.

    terça-feira, 13 de agosto de 2013 17:24
  • Deleted
    terça-feira, 13 de agosto de 2013 23:48
  • Roman,

    Dizer que o ambiente ou a query esta lenta ou apresentando lentidão é algo bastante comum, mas encontrar as suas possíveis causas realmente é algo complexo.

    Eu particularmente faria o seguinte, usaria a técnica de Dividir para Conqustar, onde dividira a sua query em diversas partes e faria uma análise do retorno de dados em cada parte.

    Outra técnica muito prática é trabalhar com Tabelas Temporárias para realizar o processo de análise condicional dos seus dados sem impactar nos objetos que realmente possuem os mesmos, outro fator de grande impacto na melhoria é utilizar views e stored procedures.

    O uso do NoLock é uma forma de se evitar o chamado bloqueio de dados, neste caso, você estará permitindo que o mesmo dado possa ser lido e utilizado por processos distintos independente de quem esta fazendo uso, algo que poderá gerar os chamados dados fantasmas ou leituras sujas.

    Não vejo isso como melhor técnica para se obter performance, na verdade é uma forma de evitar gargalos, mas penso que podemos trabalhar de outra maneira.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 14 de agosto de 2013 14:15
  • Junior,

    Eu fiz uma analise e percebi que a tabela TRELSLD é que causa a lentidão.

    Apenas removi os campos que fazem referencia a essa tabela no select e a consulta ficou rápida.

    Obviamente que preciso desses campos aparecendo no select. 

    A única coisa que fiz foi recriar e reorganizar os indices dessa tabela, mas não adiantou. Sou inexperiente em banco, e nem sei se isso resolveria.

    Se eu lhe enviar o plano de execução poderia ser útil?

    Obrigado

    quarta-feira, 14 de agosto de 2013 15:07
  • Bom pessoal,

     

    É o seguinte:

    Estava usando left join em uma tabela que não pode ter left join.

    Mudei para inner join e funcionou.

     

    Obrigado pela atenção.

    quarta-feira, 14 de agosto de 2013 18:21