none
Melhorar Performance de Pocedure RRS feed

  • Pergunta

  • Senhores, Bom Dia!!

    Como posso melhorar a performance Procedure  abaixo? Pois o resultado está demorando muito tempo para ser retornado. Segue Script que contempla a  Proc p/ analise. Obrigado, Abraços

           SELECT 
                 CAST(b.clienteID AS VARCHAR(50)) + '.' + CONVERT(VARCHAR(10),b.dtLiberadoIDS, 112) + '.' +  CAST(b.concluidoID AS VARCHAR(10)) AS PreLote  
                 ,b.clienteid
                 ,b.np  
                 ,b.vlnegociado          
                 ,GETDATE() AS DATA 
                 ,nfsubcontratado
                 ,filialid
                 ,dtLiberadoIDS
                 ,concluidoID
                 ,liberadoids
           into #tempOS
           FROM dbo.visios                                     b  (NOLOCK)        
           WHERE       b.concluido   = 0
                        AND b.cancelado   = 0    

    DELETE from #tempOS
    where liberadoids = 0


    SELECT 
                 CAST(b.clienteID AS VARCHAR(50)) + '.' + CONVERT(VARCHAR(10),b.dtLiberadoIDS, 112) + '.' +  CAST(b.concluidoID AS VARCHAR(10)) AS PreLote  
                 ,b.clienteid
                 ,e.empresa
                 ,b.np  
                 ,a.nfsubcontratado
                 ,b.vlnegociado   
                 ,d.vlfranquia  
                 ,vlnegociado
                 ,ValorLiquido = (b.vlnegociado - d.vlfranquia - d.VlFranquiaCompl)           
                 ,GETDATE() 
    from #tempOS b
    LEFT JOIN  dbo.tbsiNotasfiliados a  (NOLOCK) ON a.nfreferente = b.nfsubcontratado AND a.clienteID = b.clienteID        
    LEFT JOIN dbo.tbsiPedidoseg            d (NOLOCK) ON b.np = d.np AND b.filialid = D.FilialID 
    LEFT JOIN TBSIAFILIADOSSIMPLES   e  (NOLOCK) ON e.clienteid = b.clienteID        


    drop table #tempOS

    quinta-feira, 7 de agosto de 2014 20:41

Respostas

  • Liandro,

    Porquê você esta utilizando tabela temporária?

    Outro detalhe você esta utilzando o NoLock, já avaliou se realmente é necessário?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    sexta-feira, 8 de agosto de 2014 19:30
  • Liandro,

    Concordo com o Pedro, o I/O gerado pela manipulação de tabelas temporárias deve estar aumentando muito o processamento de sua instância SQL e, consequentemente, levando mais tempo para retornar os dados.

    Sugiro que você substitua à tabela temporária por consultas utilizando CTE.

    Para mais informações veja:

    http://msdn.microsoft.com/pt-br/library/ms175972.aspx

    http://technet.microsoft.com/pt-br/library/ms190766(v=sql.105).aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    segunda-feira, 11 de agosto de 2014 12:24
    Moderador

Todas as Respostas

  • Boa Tarde Liandro,

    Tem como você anexar o plano de execução para que possamos analisar?


    Att, Bruno Silva.

    quinta-feira, 7 de agosto de 2014 20:52
  • Boa tarde,

    Acredito que a tabela temporária não é necessária. Experimente dessa forma:

    SELECT 
        CAST(b.clienteID AS VARCHAR(50)) + '.' +
        CONVERT(VARCHAR(10),b.dtLiberadoIDS, 112) + '.' + 
        CAST(b.concluidoID AS VARCHAR(10)) AS PreLote  
       ,b.clienteid
       ,e.empresa
       ,b.np  
       ,a.nfsubcontratado
       ,b.vlnegociado   
       ,d.vlfranquia  
       ,vlnegociado
       ,ValorLiquido = (b.vlnegociado - d.vlfranquia - d.VlFranquiaCompl)           
       ,GETDATE() 
    from dbo.visios b
    LEFT JOIN  dbo.tbsiNotasfiliados a
        ON 
            a.nfreferente = b.nfsubcontratado AND 
            a.clienteID = b.clienteID        
    LEFT JOIN dbo.tbsiPedidoseg d
        ON 
            b.np = d.np AND 
            b.filialid = D.FilialID 
    LEFT JOIN TBSIAFILIADOSSIMPLES e
        ON 
            e.clienteid = b.clienteID
    WHERE
        b.concluido = 0 AND
        b.cancelado = 0 AND
        b.liberadoids <> 0

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 7 de agosto de 2014 20:54
  • Liandro,

    Porquê você esta utilizando tabela temporária?

    Outro detalhe você esta utilzando o NoLock, já avaliou se realmente é necessário?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    sexta-feira, 8 de agosto de 2014 19:30
  • Liandro,

    Concordo com o Pedro, o I/O gerado pela manipulação de tabelas temporárias deve estar aumentando muito o processamento de sua instância SQL e, consequentemente, levando mais tempo para retornar os dados.

    Sugiro que você substitua à tabela temporária por consultas utilizando CTE.

    Para mais informações veja:

    http://msdn.microsoft.com/pt-br/library/ms175972.aspx

    http://technet.microsoft.com/pt-br/library/ms190766(v=sql.105).aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    segunda-feira, 11 de agosto de 2014 12:24
    Moderador