Estou conectado em um servidor SQL Server 2008 via TCP/IP na Internet, link de 10Mbit e executando os scripts via Management Studio. Então caso você tenha uma situação similar e queira comprovar os benefícios do SET NOCOUNT ON de uma maneira bem simples, execute primeiro esta rotina:
create proc TESTE_NOCOUNT_OFF as
begin
create table
#temp (
ID int not null primary key,
CAMPOTESTE varchar(10)
)
set nocount
off
declare @contador int
set @contador = 1
while @contador < 100000
begin
insert into #temp (ID, CAMPOTESTE) values (@contador, 'TESTETESTE')
set @contador = @contador + 1
end
drop table
#temp
end
GO
exec
TESTE_NOCOUNT_OFF
GO
drop proc TESTE_NOCOUNT_OFF
GO
Anote o tempo de execução com o NOCOUNT desligado (aqui rodou em 44 segundos) e depois execute esta rotina, com o NOCOUNT ligado:
create proc TESTE_NOCOUNT_ON as
begin
create table
#temp (
ID int not null primary key,
CAMPOTESTE varchar(10)
)
set nocount
on
declare @contador int
set @contador = 1
while @contador < 100000
begin
insert into #temp (ID, CAMPOTESTE) values (@contador, 'TESTETESTE')
set @contador = @contador + 1
end
drop table
#temp
set nocount
off
end
GO
exec
TESTE_NOCOUNT_ON
GO
drop proc TESTE_NOCOUNT_ON
GO
Agora sem as mensagens rodou em 1 segundo. Legal, não? O motivo da demora com as mensagens não é o consumo de CPU ou I/O, mas sim rede. Como o SQL Server transmite por padrão as mensagens com os contadores, independente destas serem usadas pelo cliente, a performance da rotina sofre um grande impacto. Eliminando as mensagens, é eliminado este overhead e há uma melhoria sensível na execução.
Qualquer dúvida, avisem. Obrigado por visitar o blog!
Valeu pela dica.
ResponderExcluirEstou realizando o treinamento em sql server pelo curso adv, www.cursoadv.com.
Sempre busco dicas para melhorar meu desempenho, gostei muito do site, têm muito material bom.
Parabéns