Ich habe zwei SQL Server-Instanzen auf demselben 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)
Die sp_configure-Ergebnisse sind auf beiden Instanzen gleich (mit Ausnahme der neuen 2016-Optionen).
Ich habe auf beiden Instanzen neue Datenbanken auf demselben Datenträgerordner erstellt. Die Autogrowth-Parameter sind dieselben.
Die Optionen zum automatischen Erstellen und automatischen Aktualisieren von Statistiken sind deaktiviert.
Dann habe ich einen Test mit 10000 Beilagen in einem Haufen gemacht:
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
Ergebnis 1
Die durchschnittliche Testzeit
- 2012 - 530 ms
- 2016 - 600 ms
2016 ist also um 11% langsamer.
- Anschließend habe ich einen SQL Profiler-Trace mit in der Tabelle gespeicherten Ergebnissen erstellt, um die Dauer der einzelnen Einfügungen in Mikrosekunden anzuzeigen.
Ergebnis 2
Das Histogramm einer einzelnen Einfügedauer 2012 gegenüber 2016:
Das Wachstum von Transaktionsprotokollen aus sys.dm_io_virtual_file_stats ist:
- 2012 - 5174784 Bytes
- 2016 - 5171200 Bytes
Während dieser Tests werden beide Instanzen gestartet. Es wird jedoch jeweils nur ein Test zu einer Instanz ausgeführt. Ich habe 8 GB RAM pro Instanz zugewiesen. Die Abfragepläne sind die gleichen. Es wäre interessant, jede Instanz auf einer eigenen Box auszuführen. Aber wahrscheinlich ist die eine Maschine besser, weil wir hier keine versteckten Hardware- und Umgebungsunterschiede haben.
Fragen
- Warum ist 2016 langsamer?
- Darf jemand diesen Test reproduzieren?