Eu tenho duas instâncias do SQL Server no mesmo servidor:
- Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Standard Edition (64 bits)
- Microsoft SQL Server 2016 (SP1-CU5) (KB4040714) - 13.0.4451.0 (X64) Enterprise Edition (64 bits)
Os resultados sp_configure são os mesmos nas duas instâncias (exceto nas novas opções de 2016).
Criei novos bancos de dados nas duas instâncias na mesma pasta de disco. Os parâmetros de crescimento automático são os mesmos.
As opções de estatísticas de criação automática e atualização automática estão desativadas.
Então eu fiz um teste com 10000 inserções em uma pilha:
set nocount on
go
create table dbo.TestInsert ( i int not null, s varchar(50) not null )
declare @d1 datetime, @d2 datetime, @i int
set @d1 = getdate()
set @i = 1
while @i <= 10000
begin
insert into dbo.TestInsert ( i, s ) select @i, replicate( 'a', 50 )
set @i = @i + 1
end
set @d2 = getdate()
select datediff(ms, @d1, @d2)
drop table dbo.TestInsert
Resultado 1
O tempo médio de teste
- 2012 - 530 ms
- 2016 - 600 ms
Então, 2016 é cerca de 11% mais lento.
- Em seguida, fiz um rastreamento do SQL Profiler com os resultados salvos na tabela para ver a duração da inserção única em microssegundos.
Resultado 2
O histograma de uma única inserção com duração de 2012 x 2016:
O crescimento dos logs de transações de sys.dm_io_virtual_file_stats é:
- 2012 - 5174784 bytes
- 2016 - 5171200 bytes
Durante esses testes, ambas as instâncias são iniciadas. Mas um teste está sendo executado apenas em uma instância de cada vez. Eu aloquei 8 GB de RAM por instância. Os planos de consulta são os mesmos. Seria interessante executar cada instância em sua própria caixa. Mas provavelmente a única máquina é melhor, porque aqui não temos diferenças ocultas em termos de hardware e ambiente.
Questões
- Por que 2016 é mais lento?
- Alguém pode reproduzir este teste?