Base de données SQL Server 2017 Enterprise CU16 14.0.3076.1
Nous avons récemment essayé de passer des tâches de maintenance par défaut de reconstruction d'index à Ola Hallengren IndexOptimize
. Les travaux de reconstruction d'index par défaut étaient en cours d'exécution depuis quelques mois sans aucun problème, et les requêtes et les mises à jour fonctionnaient avec des délais d'exécution acceptables. Après avoir exécuté IndexOptimize
sur la base de données:
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'
les performances étaient extrêmement dégradées. Une déclaration de mise à jour qui a IndexOptimize
pris 100 ms avant a pris 78 000 ms après (en utilisant un plan identique), et les requêtes exécutaient également plusieurs ordres de grandeur.
Comme il s'agit toujours d'une base de données de test (nous migrons un système de production depuis Oracle), nous sommes revenus à une sauvegarde et désactivés IndexOptimize
et tout est revenu à la normale.
Cependant, nous aimerions comprendre ce qui IndexOptimize
fait différemment du "normal" Index Rebuild
qui aurait pu causer cette dégradation extrême des performances afin de nous assurer de l'éviter une fois que nous serons en production. Toute suggestion sur ce qu'il faut rechercher serait grandement appréciée.
Plan d'exécution de l'instruction de mise à jour lorsqu'elle est lente. c'est-à-dire
après IndexOptimize
Plan d'exécution réel (à venir dès que possible)
Je n'ai pas pu voir de différence.
Planifiez la même requête lorsqu'elle est rapide
Plan d'exécution réel