SQL Server 2016 vs 2012 производительность вставки

14
  • У меня есть два экземпляра 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 медленнее?
  • Может кто-нибудь воспроизвести этот тест?
Ольга Сосонных
источник
Любые изменения с TF 692 на SQL Server 2016? blogs.msdn.microsoft.com/sql_server_team/…
Джо Оббиш
«Любые изменения с TF 692 на SQL Server 2016» Без изменений.
Ольга Сосонных
1
Я бы снова запустил тесты, но при тестировании отключил пассивный экземпляр. Экземпляр 2012 года может запускать контрольную точку или другой асинхронный процесс после того, как вы завершили его тестирование, забирая ресурсы у экземпляра 2016 года.
Набиль Беккер
1
Также оба экземпляра должны быть полностью исправлены, поэтому SQL 2016 SP 2 CU 2 и SQL 2012 SP4 + GDR ( support.microsoft.com/en-us/help/4057116/… )
Дэвид Браун - Microsoft
3
Также без явной транзакции это просто проверяет, сколько времени требуется для очистки файла журнала.
Дэвид Браун - Microsoft

Ответы:

1

Очевидно, что совпадение наличия одинаковых версий на одном сервере очень сложно, но ... Я надеюсь, что мои результаты помогут вам. У меня есть две разные машины, настроенные как Windows Server 2012 R2 Standard. К сожалению, они не имеют одинаковое оборудование, но похожи:

  1. Машина 1 (SQL Server 2016)

    • Процессор: Intel (R) Xeon (r) CPU X5650 с частотой 2,67 ГГц
    • Microsoft SQL Server 2016 (окончательная первоначальная версия) - 13.0.1601.5 (X64) 29 апреля 2016 г. 23:23:58 Авторское право (c) Microsoft Corporation Standard Edition (64-разрядная версия) на Windows Server 2012 R2 Standard 6.3 (сборка 9600:) (гипервизор)
  2. Машина 2 (SQL Server 2012)

    • Процессор: Intel (R) Xeon (R) CPU E5-2667 0 @ 2,9 ГГц
    • Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 14 мая 2014 г. 18:34:29 Авторское право (c) Microsoft Corporation Standard Edition (64-разрядная версия) в Windows NT 6.3 (сборка 9600:) (гипервизор)

И я запускаю 5 раз на обеих машинах один и тот же скрипт, который вы предоставили, и получил следующее среднее значение:

  • 2012: 9961
  • 2016: 8971

Каковы почти противоположные результаты, которые вы получаете. В любом случае, как вы видели, моя машина 2012 года имеет лучший процессор, но жесткий диск, который обычно показывает разницу, тот же. Таким образом, даже если в 2012 году ресурсы лучше, в моем случае это будет немного медленнее.

(Извините, пожалуйста, проверьте еще раз, моя первая версия имела несколько важных ошибок)

Ангел М.
источник
-2

Можете ли вы добавить (TABLOCK) подсказку, чтобы включить минимальное ведение журнала? Какая разница после применения этой подсказки?

INSERT INTO t_heap WITH (TABLOCK) 
SELECT * 
FROM t_source
Селло Хлабели
источник