У меня есть два экземпляра SQL Server на одном сервере:
- Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Standard Edition (64-разрядная версия)
- Microsoft SQL Server 2016 (SP1-CU5) (KB4040714) - 13.0.4451.0 (X64) Enterprise Edition (64-разрядная версия)
Результаты sp_configure одинаковы для обоих экземпляров (кроме новых параметров 2016 года).
Я создал новые базы данных в обоих экземплярах в одной папке на диске. Параметры автоматического роста одинаковы.
Параметры автообновления и автообновления отключены.
Затем я сделал тест с 10000 вставками в кучу:
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
Результат 1
Среднее время теста
- 2012 - 530 мс
- 2016 - 600 мс
Таким образом, 2016 год примерно на 11% медленнее.
- Затем я сделал трассировку SQL Profiler с результатами, сохраненными в таблице, чтобы увидеть длительность одной вставки в микросекундах.
Результат 2
Гистограмма длительности одной вставки 2012 против 2016:
Рост журналов транзакций из sys.dm_io_virtual_file_stats:
- 2012 - 5174784 байта
- 2016 год - 5171200 байт
Во время этих тестов оба экземпляра запускаются. Но один тест выполняется только в одном экземпляре каждый раз. Я выделил 8 ГБ ОЗУ для каждого экземпляра. Планы запросов одинаковы. Было бы интересно запускать каждый экземпляр на отдельной коробке. Но, вероятно, одна машина лучше, потому что здесь у нас нет аппаратных и экологических скрытых отличий.
Вопросов
- Почему 2016 медленнее?
- Может кто-нибудь воспроизвести этот тест?