SQL Server 2016 vs 2012 memasukkan kinerja

14
  • Saya memiliki dua contoh SQL Server di server yang sama:

    • Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Edisi Standar (64-bit)
    • Microsoft SQL Server 2016 (SP1-CU5) (KB4040714) - 13.0.4451.0 Edisi Perusahaan (X64) (64-bit)
  • sp_configure hasilnya sama di kedua instance (kecuali opsi 2016 baru).

  • Saya telah membuat database baru pada kedua instance pada folder disk yang sama. Parameter autogrowth adalah sama.

  • Opsi statistik autocreate dan pembaruan otomatis dimatikan.

  • Lalu saya telah membuat tes dengan 10.000 sisipan ke tumpukan:

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

Hasil 1

Waktu tes rata-rata

  • 2012 - 530 ms
  • 2016 - 600 ms

Jadi, 2016 sekitar 11% lebih lambat.

  • Kemudian saya telah membuat jejak SQL Profiler dengan hasil disimpan ke tabel untuk melihat durasi memasukkan tunggal dalam mikrodetik.

Hasil 2

Histogram durasi memasukkan tunggal 2012 vs 2016: masukkan deskripsi gambar di sini

Pertumbuhan log transaksi dari sys.dm_io_virtual_file_stats adalah:

  • 2012 - 5174784 byte
  • 2016 - 5171200 byte

Selama tes ini kedua contoh dimulai. Tetapi satu tes hanya berjalan pada satu contoh setiap kali. Saya telah mengalokasikan 8Gb RAM per instance. Paket permintaannya sama. Akan menarik untuk menjalankan setiap instance pada kotaknya sendiri. Tapi mungkin satu mesin lebih baik, karena di sini kita tidak memiliki perbedaan perangkat keras dan lingkungan.

Pertanyaan

  • Mengapa 2016 lebih lambat?
  • Bisakah seseorang mereproduksi tes ini?
Olga Sosonnykh
sumber
Adakah perubahan dengan TF 692 di SQL Server 2016? blogs.msdn.microsoft.com/sql_server_team/…
Joe Obbish
"Setiap perubahan dengan TF 692 di SQL Server 2016" Tidak ada perubahan.
Olga Sosonnykh
1
Saya akan menjalankan tes lagi, tetapi mematikan contoh pasif saat pengujian. Instance 2012 dapat menjalankan pos pemeriksaan atau proses async lainnya setelah Anda menyelesaikan tesnya, mengambil sumber daya dari instance 2016.
Nabil Becker
1
Juga kedua contoh harus sepenuhnya ditambal, jadi SQL 2016 SP 2 CU 2, dan SQL 2012 SP4 + GDR ( support.microsoft.com/en-us/help/4057116/… )
David Browne - Microsoft
3
Juga tanpa transaksi eksplisit ini hanya menguji berapa lama waktu yang diperlukan untuk mem-flush file log.
David Browne - Microsoft

Jawaban:

1

Jelas sangat sulit, kebetulan memiliki versi yang persis sama di server yang sama tapi ... Saya harap hasil saya akan membantu Anda. Saya memiliki dua mesin yang berbeda mengkonfigurasi Windows Server 2012 R2 Standard Sayangnya mereka tidak memiliki perangkat keras yang sama tetapi serupa:

  1. Mesin 1 (SQL Server 2016)

    • Prosesor: Intel (R) Xeon (r) CPU X5650 @ 2.67GHz
    • Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64) 29 Apr 2016 23:23:58 Hak cipta (c) Edisi Standar Microsoft Corporation (64-bit) pada Windows Server 2012 R2 Standar 6.3 (Build 9600:) (Hypervisor)
  2. Mesin 2 (SQL Server 2012)

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

Dan saya menjalankan 5 kali di kedua mesin script yang sama yang Anda berikan dan memperoleh rata-rata berikut:

  • 2012: 9961
  • 2016: 8971

Apa hasil yang hampir berlawanan yang Anda dapatkan. Bagaimanapun, seperti yang Anda lihat, mesin 2012 saya memiliki prosesor yang lebih baik tetapi hard disk yang biasanya menunjukkan perbedaannya sama. Jadi, bahkan jika 2012 memiliki sumber daya yang lebih baik sedikit lebih lambat untuk kasus saya.

(Maaf, tolong, periksa lagi, versi pertamaku memiliki beberapa erratum penting)

Malaikat M.
sumber
-2

Bisakah Anda menambahkan (TABLOCK) petunjuk untuk mengaktifkan pencatatan minimum? Apa bedanya setelah menerapkan petunjuk ini?

INSERT INTO t_heap WITH (TABLOCK) 
SELECT * 
FROM t_source
Sello Hlabeli
sumber