Rendimiento de inserción de SQL Server 2016 vs 2012

14
  • Tengo dos instancias de SQL Server en el mismo servidor:

    • Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Edición estándar (64 bits)
    • Microsoft SQL Server 2016 (SP1-CU5) (KB4040714) - 13.0.4451.0 (X64) Enterprise Edition (64 bits)
  • Los resultados de sp_configure son los mismos en ambas instancias (excepto las nuevas opciones de 2016).

  • He creado nuevas bases de datos en ambas instancias en la misma carpeta de disco. Los parámetros de crecimiento automático son los mismos.

  • Las opciones de estadísticas de creación automática y actualización automática están desactivadas.

  • Luego hice una prueba con 10000 inserciones en un montón:

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

El tiempo de prueba promedio

  • 2012 - 530 ms
  • 2016 - 600 ms

Entonces, 2016 es aproximadamente un 11% más lento.

  • Luego hice un seguimiento de SQL Profiler con resultados guardados en la tabla para ver la duración de la inserción única en microsegundos.

Resultado 2

El histograma de una duración de inserción única 2012 vs 2016: ingrese la descripción de la imagen aquí

El crecimiento de los registros de transacciones de sys.dm_io_virtual_file_stats es:

  • 2012 - 5174784 bytes
  • 2016 - 5171200 bytes

Durante estas pruebas se inician ambas instancias. Pero una prueba se ejecuta solo en una instancia cada vez. He asignado 8 Gb de RAM por instancia. Los planes de consulta son los mismos. Sería interesante ejecutar cada instancia en su propio cuadro. Pero probablemente la única máquina sea mejor, porque aquí no tenemos hardware ni diferencias ocultas en el medio ambiente.

Preguntas

  • ¿Por qué es 2016 más lento?
  • ¿Alguien puede reproducir esta prueba?
Olga Sosonnykh
fuente
¿Algún cambio con TF 692 en SQL Server 2016? blogs.msdn.microsoft.com/sql_server_team/…
Joe Obbish
"Cualquier cambio con TF 692 en SQL Server 2016" Sin cambios.
Olga Sosonnykh
1
Volvería a ejecutar las pruebas, pero apagaba la instancia pasiva cuando las probaba. La instancia de 2012 podría estar ejecutando un punto de control u otro proceso asíncrono una vez que haya completado su prueba, quitando recursos de la instancia de 2016.
Nabil Becker
1
Además, ambas instancias deben estar completamente parcheadas, por lo que SQL 2016 SP 2 CU 2 y SQL 2012 SP4 + GDR ( support.microsoft.com/en-us/help/4057116/… )
David Browne - Microsoft
3
Además, sin una transacción explícita, esto solo prueba cuánto tiempo se tarda en vaciar el archivo de registro.
David Browne - Microsoft

Respuestas:

1

Obviamente es muy difícil la coincidencia de tener exactamente las mismas versiones en el mismo servidor pero ... espero que mis resultados te ayuden. Tengo dos máquinas diferentes configuradas tanto en Windows Server 2012 R2 Standard. Desafortunadamente no tienen el mismo hardware pero similar:

  1. Máquina 1 (SQL Server 2016)

    • Procesador: Intel (R) Xeon (r) CPU X5650 @ 2.67GHz
    • Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64) 29 de abril de 2016 23:23:58 Copyright (c) Microsoft Corporation Standard Edition (64 bits) en Windows Server 2012 R2 Standard 6.3 (Build 9600:) (Hypervisor)
  2. Máquina 2 (SQL Server 2012)

    • Procesador: Intel (R) Xeon (R) CPU E5-2667 0 @ 2.9 GHz
    • Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 14 de mayo de 2014 18:34:29 Copyright (c) Microsoft Corporation Standard Edition (64 bits) en Windows NT 6.3 (Build 9600:) (Hypervisor)

Y ejecuto 5 veces en ambas máquinas la misma secuencia de comandos que me ha proporcionado y obtuve el siguiente promedio:

  • 2012: 9961
  • 2016: 8971

¿Cuáles son los resultados casi opuestos que obtienes? De todos modos, como has visto, mi máquina 2012 tiene un mejor procesador, pero el disco duro que normalmente es el que muestra la diferencia es el mismo. Entonces, incluso si 2012 tiene mejores recursos, es un poco más lento para mi caso.

(Lo siento, por favor, verifique nuevamente, mi primera versión tuvo algunas erratas importantes)

Angel M.
fuente
-2

¿Se puede agregar una (TABLOCK) pista para permitir un registro mínimo? ¿Cuál es la diferencia después de aplicar esta pista?

INSERT INTO t_heap WITH (TABLOCK) 
SELECT * 
FROM t_source
Sello Hlabeli
fuente