none
Performance de Store Procedure RRS feed

  • Pergunta

  •  

    Amigos bom dia,

     

    Gostaria de saber se em uma SP o que me traria um maior ganho de performace a utilizao de IF ELSE ou CASE, ou teria alguma outra forma de se trabalhar de forma condicional com um maior ganho de performance.

     

    Abraos

    sexta-feira, 13 de abril de 2007 11:20

Respostas

  •  

     

     neste caso como vc. esta usando sp_executesql para rodar a quary parametrizada, e muito pouca a diferenca entre o uso dos IF, mais vc. poderia fazer uma proc para cada caso. ( o que vai deixar mais complicada a manutencao )

     

    Abs;

    sexta-feira, 13 de abril de 2007 12:16

Todas as Respostas

  • Linaldo,

     

    O conceito de Stored Procedure, quando trabalhado em um Banco de dados, tem como principal objetivo o ganho de performance, isso é indiscutível.

     

    No caso da utilização de comandos condicionais, são estes os comandos que possuem esta finalidade. Em relação a performance vai depender em muito de como esta codificado esta área dentro de bloco condicional.

     

    Logicamente quanto mais IF's, Elses e Cases você colocar mais tempo de processamento será necessário para o SQL Server, faça toda a análise na área de código, isso sem levar em consideração os operadores AND, OR, NOT.

    sexta-feira, 13 de abril de 2007 11:33
  •  

     quando maior a sua proc mais changes de perder o chache, por isso o legal e deixar as procs pequenas sem muitos ifs, etc.

     

     

    sexta-feira, 13 de abril de 2007 11:45
  •  

    Junior bom dia,

     

    Valeu pela explanação, mas na pratica voce ja chegou a medir a performance em um codigo utilizando IF ELSE e alterando o mesmo código para utilizar o CASE, qual das duas situacoes teria ou teve um melhor desempenho.

    sexta-feira, 13 de abril de 2007 11:47
  • Marcelo,

     

    Utilizo o codigo abaixo para realizar alguns calcúlos, o codigo funciona corretamente, porem eu gostaria de estar tentando melhorar o seu desempenho, voce teria alguma sugestão, lembrando que a variavel @Mes é utilizada de forma condicional avaliando do mês 01 ao mês 12.

     

     

    CREATE PROCEDURE [Turbidez_FN]
    @Mes nvarchar(2),
    @Ano nvarchar(4),
    @Sistema as nvarchar(4),
    @CodParametro as nvarchar(4),
    @Campo nvarchar(1000),
    @Soma as nvarchar(1)
    as
    declare
    @Comando_SQL nvarchar(4000),
    @Clausula_Where nvarchar(4000),
    @Parametros nvarchar(4000),
    @Tabela nvarchar(4000),
    @Nome_Tabela nvarchar(1000),
    @Tipo as nvarchar(2),
    @Registros int,
    @Reg int

    set @Tipo = 'FN'
    Set @Tabela = N'dbo.TBResultado_Analises'
    Set @Parametros = N'@Reg int Output'

    if @campo<>"[Cloro Residual Livre]" and @Campo<>"[Bacterias Heterotroficas]"
       set @Clausula_Where = N' Where ' + @Campo + '  >= 0 '  +  ' and codigodosistema = '+ ''''+@Sistema+''''+' and tipoagua = ' + ''''+@Tipo+'''' + ' and month(datacoleta)= ' + @Mes + ' and year(datacoleta)= ' + @Ano + 'and codigoponto <= ' + '50' 
    else
        set @Clausula_Where = N' Where ' + @Campo + '  >= 0 '  +  ' and codigodosistema = '+ ''''+@Sistema+''''+' and tipoagua = ' + ''''+@Tipo+'''' + ' and month(datacoleta)= ' + @Mes + ' and year(datacoleta)= ' + @Ano + 'and codigoponto <= ' + '50'  + ' and [indicador de recoleta]=' + '0'

    Set @Comando_SQL = N'SELECT @Reg = Count(' + @Campo + ') from ' + @Tabela + @Clausula_Where

    EXECUTE SP_ExecuteSql @Comando_Sql,@Parametros,@Reg=@Registros Output

    select @Registros as Registros

     

    if @Mes=1
       BEGIN
       if @Soma="S"
          begin
             UPDATE tbSSaude_PlanoDeAmostragem
             SET JanTratQtd_realizada= @Registros+JanTratQtd
             where   anoreferencia=@Ano  AND CodigoDoSistema=@Sistema and  codigodoparametro=@CodParametro
          end
       else
           if  @Soma<>"S"
      BEGIN
        UPDATE tbSSaude_PlanoDeAmostragem
        SET JanTratQtd_realizada= @Registros
      where   anoreferencia=@Ano  AND CodigoDoSistema=@Sistema and  codigodoparametro=@CodParametro
    end
    end

    sexta-feira, 13 de abril de 2007 11:58
  •  

     

     neste caso como vc. esta usando sp_executesql para rodar a quary parametrizada, e muito pouca a diferenca entre o uso dos IF, mais vc. poderia fazer uma proc para cada caso. ( o que vai deixar mais complicada a manutencao )

     

    Abs;

    sexta-feira, 13 de abril de 2007 12:16
  • Marcelo,

     

    Como teoricamente nao terei nenhuma melhora de performance, vou deixar o codigo como esta por questôes de manutenção na aplicação, de qualquer forma valeu.

     

     

    Abracao

    sexta-feira, 13 de abril de 2007 12:23