Wydajność wstawiania programu SQL Server 2016 vs 2012

14
  • Mam dwa wystąpienia programu SQL Server na tym samym serwerze:

    • 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)
  • Wyniki sp_configure są takie same w obu instancjach (z wyjątkiem nowych opcji 2016).

  • Utworzyłem nowe bazy danych dla obu instancji w tym samym folderze na dysku. Parametry wzrostu są takie same.

  • Opcje statystyk automatycznego tworzenia i automatycznej aktualizacji są wyłączone.

  • Następnie wykonałem test z 10000 wstawkami w stercie:

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

Wynik 1

Średni czas testu

  • 2012 - 530 ms
  • 2016 - 600 ms

Tak więc rok 2016 jest o 11% wolniejszy.

  • Następnie utworzyłem śledzenie programu SQL Profiler z wynikami zapisanymi w tabeli, aby zobaczyć czas trwania pojedynczego wstawiania w mikrosekundach.

Wynik 2

Histogram czasu trwania pojedynczej wkładki 2012 vs 2016: wprowadź opis zdjęcia tutaj

Wzrost dzienników transakcji z sys.dm_io_virtual_file_stats wynosi:

  • 2012 - 5174784 bajtów
  • 2016 - 5171200 bajtów

Podczas tych testów uruchamiane są oba wystąpienia. Ale za każdym razem jeden test jest uruchamiany tylko w jednej instancji. Przydzieliłem 8 GB pamięci RAM na instancję. Plany zapytań są takie same. Interesujące byłoby uruchomienie każdej instancji na osobnym polu. Ale prawdopodobnie jedna maszyna jest lepsza, ponieważ tutaj nie mamy ukrytych różnic sprzętowych i środowiskowych.

pytania

  • Dlaczego 2016 jest wolniejszy?
  • Czy ktoś może odtworzyć ten test?
Olga Sosonnykh
źródło
Wszelkie zmiany w TF 692 na SQL Server 2016? blogs.msdn.microsoft.com/sql_server_team/…
Joe Obbish
„Wszelkie zmiany w TF 692 na SQL Server 2016” Brak zmian.
Olga Sosonnykh
1
Chciałbym ponownie uruchomić testy, ale podczas testowania zamknąłem instancję pasywną. Instancja z 2012 roku może uruchamiać punkt kontrolny lub inny proces asynchroniczny po zakończeniu testu, co zabiera zasoby od instancji z 2016 roku.
Nabil Becker
1
Również oba wystąpienia powinny zostać całkowicie załatane, więc SQL 2016 SP 2 CU 2 i SQL 2012 SP4 + GDR ( support.microsoft.com/en-us/help/4057116/... )
David Browne - Microsoft
3
Również bez wyraźnej transakcji sprawdza to tylko, ile czasu zajmuje opróżnienie pliku dziennika.
David Browne - Microsoft

Odpowiedzi:

1

Oczywiście bardzo trudno jest zbierać dokładnie te same wersje na tym samym serwerze, ale ... Mam nadzieję, że moje wyniki ci pomogą. Mam dwa różne komputery skonfigurowane zarówno w systemie Windows Server 2012 R2 Standard. Niestety nie mają tego samego sprzętu, ale podobne:

  1. Maszyna 1 (SQL Server 2016)

    • Procesor: Intel (R) Xeon (r) CPU X5650 @ 2.67GHz
    • Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64) 29 kwietnia 2016 23:23:58 Prawa autorskie (c) Microsoft Corporation Standard Edition (64-bit) w systemie Windows Server 2012 R2 Standard 6.3 (kompilacja 9600:) (Hypervisor)
  2. Komputer 2 (SQL Server 2012)

    • Procesor: Intel (R) Xeon (R) CPU E5-2667 0 @ 2,9 GHz
    • Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 14 maja 2014 18:34:29 Prawa autorskie (c) Microsoft Corporation Standard Edition (64-bit) na Windows NT 6.3 (kompilacja 9600:) (Hypervisor)

Uruchomiłem 5 razy na obu komputerach ten sam skrypt, który podałeś i uzyskałeś następującą średnią:

  • 2012: 9961
  • 2016: 8971

Jakie są prawie przeciwne wyniki, które otrzymujesz. W każdym razie, jak widzieliście, moja maszyna z 2012 roku ma lepszy procesor, ale dysk twardy, który zwykle pokazuje różnicę, jest taki sam. Tak więc, nawet jeśli rok 2012 ma lepsze zasoby, jest nieco wolniejszy w moim przypadku.

(Przepraszam, proszę sprawdź ponownie, moja pierwsza wersja miała kilka ważnych błędów)

Angel M.
źródło
-2

Czy możesz dodać (TABLOCK) wskazówkę, aby umożliwić minimalne logowanie? Jaka jest różnica po zastosowaniu tej wskazówki?

INSERT INTO t_heap WITH (TABLOCK) 
SELECT * 
FROM t_source
Sello Hlabeli
źródło