Продуктивність вставки SQL Server 2016 проти 2012 року


14
  • У мене є два екземпляри SQL Server на одному сервері:

    • Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Стандартне видання (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 (RTM) - 13.0.1601.5 (X64) 29 квітня 2016 23:23:58 Авторські права (c) Стандартна версія Microsoft Corporation (64-розрядна версія) на Windows Server 2012 R2 Standard 6.3 (збірка 9600:) (Hypervisor)
  2. Машина 2 (SQL Server 2012)

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

І я запускаю 5 разів на обох машинах той самий сценарій, який ви вказали, і отримав таке середнє значення:

  • 2012: 9961
  • 2016: 8971

Які майже протилежні результати ви отримуєте. У будь-якому випадку, як ви вже бачили, моя машина 2012 року має кращий процесор, але на жорсткому диску, який зазвичай є різницею, однакова. Тож навіть якщо 2012 рік має кращі ресурси, це трохи повільніше для мого випадку.

(Вибачте, будь ласка, ще раз перевірте, моя перша версія мала деякі важливі помилки)


-2

Чи можете ви додати (TABLOCK) підказку, щоб увімкнути мінімальний журнал? Яка різниця після застосування цього підказу?

INSERT INTO t_heap WITH (TABLOCK) 
SELECT * 
FROM t_source
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.