Prestazioni dell'inserzione di SQL Server 2016 vs 2012


14
  • 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: inserisci qui la descrizione dell'immagine

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?

Qualche cambiamento con TF 692 su SQL Server 2016? blogs.msdn.microsoft.com/sql_server_team/…
Joe Obbish,

"Qualsiasi modifica con TF 692 su SQL Server 2016" Nessuna modifica.
Olga Sosonnykh,

1
Avrei eseguito di nuovo i test, ma avrei chiuso l'istanza passiva durante il test. L'istanza del 2012 potrebbe eseguire un checkpoint o un altro processo asincrono dopo aver completato il test, portando via le risorse dall'istanza 2016.
Nabil Becker,

1
Inoltre, entrambe le istanze dovrebbero essere completamente patchate, quindi SQL 2016 SP 2 CU 2 e SQL 2012 SP4 + GDR ( support.microsoft.com/en-us/help/4057116/… )
David Browne - Microsoft

3
Inoltre, senza una transazione esplicita, viene verificato solo il tempo necessario per svuotare il file di registro.
David Browne - Microsoft

Risposte:


1

Ovviamente è molto difficile la coincidenza di avere esattamente le stesse versioni nello stesso server ma ... Spero che i miei risultati ti possano aiutare. Ho due macchine diverse configurate sia Windows Server 2012 R2 Standard. Sfortunatamente non hanno lo stesso hardware ma simili:

  1. Macchina 1 (SQL Server 2016)

    • Processore: Intel (R) Xeon (r) CPU X5650 a 2,67 GHz
    • Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64) 29 aprile 2016 23:23:58 Copyright (c) Microsoft Corporation Standard Edition (64-bit) su Windows Server 2012 R2 Standard 6.3 (Build 9600:) (Hypervisor)
  2. Macchina 2 (SQL Server 2012)

    • Processore: CPU Intel (R) Xeon (R) E5-2667 0 @ 2,9 GHz
    • Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 14 maggio 2014 18:34:29 Copyright (c) Microsoft Corporation Standard Edition (64-bit) su Windows NT 6.3 (Build 9600:) (Hypervisor)

E corro 5 volte in entrambe le macchine lo stesso script che hai fornito e ottenuto la seguente media:

  • 2012: 9961
  • 2016: 8971

Quali sono i risultati quasi opposti che ottieni. Comunque, come hai visto, la mia macchina del 2012 ha un processore migliore ma il disco rigido che normalmente è ciò che mostra la differenza è lo stesso. Quindi, anche se il 2012 ha risorse migliori è un po 'più lento per il mio caso.

(Scusate, per favore, ricontrollate, la mia prima versione aveva alcuni errori importanti)


-2

Puoi aggiungere un (TABLOCK) suggerimento per abilitare la registrazione minima? Qual è la differenza dopo aver applicato questo suggerimento?

INSERT INTO t_heap WITH (TABLOCK) 
SELECT * 
FROM t_source
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.