Ho due istanze di SQL Server sullo stesso server:
- Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Standard Edition (64 bit)
- Microsoft SQL Server 2016 (SP1-CU5) (KB4040714) - 13.0.4451.0 (X64) Enterprise Edition (64-bit)
I risultati di sp_configure sono gli stessi in entrambe le istanze (ad eccezione delle nuove opzioni del 2016).
Ho creato nuovi database su entrambe le istanze nella stessa cartella del disco. I parametri di crescita automatica sono gli stessi.
Le opzioni statistiche di creazione automatica e aggiornamento automatico sono disattivate.
Quindi ho fatto un test con 10000 inserti in un heap:
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
Risultato 1
Il tempo medio di prova
- 2012 - 530 ms
- 2016 - 600 ms
Quindi, il 2016 è circa l'11% più lento.
- Quindi ho creato una traccia di SQL Profiler con i risultati salvati nella tabella per vedere la durata dell'inserimento singolo in microsecondi.
Risultato 2
L'istogramma di un singolo inserto durata 2012 vs 2016:
La crescita dei registri delle transazioni da sys.dm_io_virtual_file_stats è:
- 2012-5174784 byte
- 2016 - 5171200 byte
Durante questi test vengono avviate entrambe le istanze. Ma un test viene eseguito solo in un'unica istanza ogni volta. Ho assegnato 8 GB di RAM per istanza. I piani di query sono gli stessi. Sarebbe interessante eseguire ogni istanza nella sua casella. Ma probabilmente l'unica macchina è migliore, perché qui non abbiamo differenze nascoste hardware e ambientale.
Domande
- Perché il 2016 è più lento?
- Qualcuno può riprodurre questo test?