База данных SQL Server 2017 Enterprise CU16 14.0.3076.1
Недавно мы попытались переключиться с заданий по техническому обслуживанию на восстановление индекса по умолчанию на Ola Hallengren IndexOptimize
. Задания по перестройке индекса по умолчанию выполнялись в течение нескольких месяцев без каких-либо проблем, а запросы и обновления работали с приемлемым временем выполнения. После запуска IndexOptimize
в базе данных:
EXECUTE dbo.IndexOptimize
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y'
производительность была крайне ухудшена. Оператор обновления, который раньше занимал 100 мс, потом IndexOptimize
занимал 78 000 мс (с использованием идентичного плана), и запросы также выполнялись на несколько порядков хуже.
Поскольку это все еще тестовая база данных (мы переносим производственную систему из Oracle), мы вернулись к резервной копии и отключили ее, IndexOptimize
и все вернулось в нормальное состояние.
Тем не менее, мы хотели бы понять, что IndexOptimize
отличается от «нормального», Index Rebuild
которое могло бы вызвать это экстремальное снижение производительности, чтобы гарантировать, что мы избежим его, как только перейдем к производству. Будем весьма благодарны за любые предложения о том, что искать.
План выполнения оператора update, когда он медленный. т.е.
после IndexOptimize
фактический план выполнения (как можно скорее)
Я не смог заметить разницу.
План для того же запроса, когда это быстро.
Фактический план выполнения
источник
Ответ Джона - правильное решение, это всего лишь дополнение к тому, какие части плана выполнения изменились, и пример того, как легко обнаружить различия с помощью обозревателя Sentry One Plan.
Просматривая все планы запросов, когда ваша производительность была снижена, вы можете легко заметить различия.
Ухудшенная производительность
Два отсчета, более 35 секунд времени процессора и истекшего времени
Ожидаемая производительность
Намного лучше
Основное ухудшение дважды в этом запросе на обновление:
план выполнения этого запроса с пониженной производительностью
Расчетный план запроса для этого запроса на обновление имеет очень высокие оценки, когда производительность снижается:
В то время как в действительности (фактический план выполнения) это все еще должно сделать работу, только не сумасшедшее количество, которое показывают оценки.
Наибольшее влияние на производительность оказывают два скана и соединения с хэш-соответствием, приведенные ниже:
Фактическое сканирование на ухудшенной производительности # 1
Фактическое сканирование на ухудшенной производительности # 2
План выполнения этого запроса с ожидаемой производительностью
Когда вы сравниваете это с оценками (или фактическими данными) плана запроса с нормальной ожидаемой производительностью, различия легко заметить.
Кроме того, предыдущие два доступа к таблицам даже не произошли:
Вы не видите этого исключения в хеш-соединении, потому что входная информация build (top) сначала вставляется в хеш-таблицу. После этого в этой хэш-таблице проверяются нулевые значения, которые возвращают нулевые значения.
источник
Без дополнительной информации мы можем делать лишь слегка информированные удары в темноте, поэтому вам следует отредактировать вопрос, чтобы предоставить немного больше информации. Например, планы запросов для этого оператора обновления, для которого вы задали сроки, как до, так и после операций обслуживания индекса, поскольку планы могут отличаться из-за обновления статистики индекса ( https://www.brentozar.com/pastetheplan). / полезно для этого, вместо того, чтобы заполнять вопрос тем, что может быть огромным фрагментом XML, или давать скриншот, который не включает в себя некоторую соответствующую информацию, содержащуюся в плане).
Хотя два очень простых момента:
источник