Desempenho de inserção do SQL Server 2016 vs 2012


14
  • 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: insira a descrição da imagem aqui

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?

Alguma alteração no TF 692 no SQL Server 2016? blogs.msdn.microsoft.com/sql_server_team/…
Joe Obbish

"Qualquer alteração no TF 692 no SQL Server 2016" Nenhuma alteração.
Olga Sosonnykh

1
Eu executaria os testes novamente, mas desligaria a instância passiva durante o teste. A instância de 2012 pode estar executando um ponto de verificação ou outro processo assíncrono assim que você concluir o teste, retirando recursos da instância de 2016.
Nabil Becker

1
As duas instâncias também devem ser completamente corrigidas, para que o SQL 2016 SP 2 CU 2 e o SQL 2012 SP4 + GDR ( support.microsoft.com/en-us/help/4057116/… )
David Browne - Microsoft

3
Além disso, sem uma transação explícita, isso apenas testa quanto tempo leva para liberar o arquivo de log.
David Browne - Microsoft

Respostas:


1

Obviamente, é muito difícil a coincidência de ter exatamente as mesmas versões no mesmo servidor, mas ... Espero que meus resultados o ajudem. Eu tenho duas máquinas diferentes configuradas no Windows Server 2012 R2 Standard. Infelizmente, eles não têm o mesmo hardware, mas semelhante:

  1. Máquina 1 (SQL Server 2016)

    • Processador: CPU Intel (R) Xeon (r) X5650 a 2.67GHz
    • Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64) 29 de abril de 2016 23:23:58 Direitos autorais (c) Microsoft Corporation Standard Edition (64 bits) no Windows Server 2012 R2 Standard 6.3 (Compilação 9600:) (Hypervisor)
  2. Máquina 2 (SQL Server 2012)

    • Processador: CPU Intel (R) Xeon (E5) E5-2667 0 a 2,9 GHz
    • Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 14 de maio de 2014 18:34:29 Direitos autorais (c) Microsoft Corporation Standard Edition (64 bits) no Windows NT 6.3 (Build 9600:) (Hypervisor)

E eu corro 5 vezes em ambas as máquinas o mesmo script que você forneceu e obteve a seguinte média:

  • 2012: 9961
  • 2016: 8971

Qual é quase os resultados opostos que você obtém. De qualquer forma, como você viu, minha máquina de 2012 tem um processador melhor, mas o disco rígido que normalmente é o que mostra a diferença é o mesmo. Portanto, mesmo que 2012 tenha melhores recursos, é um pouco mais lento para o meu caso.

(Desculpe, por favor, verifique novamente, minha primeira versão teve algumas erratas importantes)


-2

Você pode adicionar uma (TABLOCK) dica para permitir o registro mínimo? Qual é a diferença depois de aplicar esta dica?

INSERT INTO t_heap WITH (TABLOCK) 
SELECT * 
FROM t_source
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.