База даних SQL Server 2017 Enterprise CU16 14.0.3076.1
Нещодавно ми намагалися переключитися з технічного обслуговування Index Rebuild за замовчуванням на Ola Hallengren IndexOptimize
. Завдання Index Rebuild за замовчуванням працювали протягом декількох місяців без жодних проблем, а запити та оновлення працювали з прийнятними термінами виконання. Після запуску 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
що могло спричинити це надзвичайне погіршення продуктивності, щоб переконатися, що ми цього уникнемо, як тільки перейдемо до виробництва. Будемо дуже вдячні за будь-які пропозиції щодо того, на що звернути увагу.
План виконання для оператора оновлення, коли він повільний. тобто
після IndexOptimize Фактичного плану виконання ( скоро
)
Я не зміг помітити різницю.
Плануйте той самий запит, коли це швидкий
Фактичний план виконання