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:
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?