Aynı sunucuda iki SQL Server örneği var:
- Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Standart Sürüm (64 bit)
- Microsoft SQL Server 2016 (SP1-CU5) (KB4040714) - 13.0.4451.0 (X64) Kurumsal Sürüm (64 bit)
sp_configure sonuçları her iki örnekte de aynıdır (yeni 2016 seçenekleri hariç).
Aynı disk klasöründeki her iki durumda da yeni veritabanları oluşturdum. Otomatik büyüme parametreleri aynıdır.
Otomatik oluşturma ve otomatik güncelleme istatistikleri seçenekleri kapalıdır.
Sonra bir yığın içine 10000 ekler ile bir test yaptım:
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
Sonuç 1
Ortalama test süresi
- 2012 - 530 ms
- 2016-600 ms
Yani, 2016 yaklaşık% 11 daha yavaş.
- Sonra mikrosaniye cinsinden tek ekleme süresini görmek için sonuçları tabloya kaydedilmiş bir SQL Profiler izleme yaptık.
Sonuç 2
2012 ile 2016 arasındaki tek kesici uç süresinin histogramı :
İşlem günlüklerinin sys.dm_io_virtual_file_stats'tan büyümesi:
- 2012 - 5174784 bayt
- 2016 - 5171200 bayt
Bu testler sırasında her iki örnek de başlatılır. Ancak bir test her seferinde yalnızca bir örnekte gerçekleştirilir. Örnek başına 8Gb RAM ayırdım. Sorgu planları aynıdır. Her örneği kendi kutusunda çalıştırmak ilginç olurdu. Ama muhtemelen bir makine daha iyidir, çünkü burada hiçbir donanımımız ve çevremizdeki gizli farklarımız yok.
Sorular
- 2016 neden daha yavaş?
- Birisi bu testi tekrarlayabilir mi?