Показать сообщение отдельно
Старый 14.05.2020, 12:55   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,874 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
? Обсудим target_recovery_time_in_seconds ?
Привет всем.

Сегодня столкнулся со странной особенностью параметра target_recovery_time_in_seconds - он весьма сильно может влиять на производительность.

Вводные данные.
SQL Server 2016
1. База от ax4 созданная изначально в SQL 2008 и перенесеная через бекап.
2. База от ax2012 созданная из базы ax4 через конвертацию данных.

Есть запрос. Простой джоин двух табличек по 2 млн записей каждая по кластерному ключу (ItemId) с заполнением строкового поля по 10-15 символов. (Идет перекачка значения из одной таблички в другую)

Запрос по базе ax2012 работет 75 секунд.
Запрос по базе ax4 работает 40 секунд.

Структура табличек одинакова.
Почему такая разница?

Выяснилось что в базе 2012 которая создавалось с нуля инсталлятором параметр target_recovery_time_in_seconds имеет дефолтное для SQL 2016 значение - 60 секунд. А для базы 4-ки поднятой через бекап, значение 0, поэтому такая разница.

Если обнулить этот параметр в базе 12-ки, то этот запрос ускоряется в 2 раза.



Вопрос, как правильнее настраивать target_recovery_time_in_seconds для аксапты ?
Для SQL2016 у него дефолтное значение 60 (даже для tempDB). Для более ранних версий - 0

Кто-нибудь тюнинговал этот параметр ?

P.S.
Интересная ссылка в тему:
https://www.mssqltips.com/sqlservert...ver-io-spikes/