J'ai une procédure stockée qui tronque certaines tables avec environ 1,75 m de lignes dans chacune avant d'insérer de nouvelles données (basées sur des données dans d'autres tables, calculs, etc.)
Le contour de base est très simple:
Je me demande si je devrais ré-construire explicitement les index à tout moment dans ce processus? par exemple.
ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90)
[ou quelque chose de similaire]ou peut-être
ALTER INDEX ALL ON xxx DISABLE
ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90)
[ou quelque chose de similaire]Toute assistance appréciée ... pas un DBA - un dev qui sait que DB est assez bien est plus précis!
Comme avec la plupart des questions de ce type, cela dépend. Il est peu probable que vous alliez insérer les données dans la commande "correcte" de tous les index impliqués, ce qui signifie que tous ces index sont susceptibles de rencontrer beaucoup de scission de page lors du processus d'insertion. Supposons donc que vous insérez dans l'ordre d'index en cluster. Vous pouvez désactiver tous les index non clusters, tronquer, faire votre insertion, puis reconstruire tous vos index non clusters. Bien entendu, essayer les deux approches vous diront que la vérité est plus rapide quelle que soit la théorie derrière elle. :)
Plan Basic avec tous les index activés peut être lent et peut entraîner une fragmentation.
Alter Index Recuilild sur une table tronquée et donc vide ne sert donc de but. Vous devez donc modifier votre plan A. Cela devrait être:
Cela pourrait rester lent, mais au moins vous obtenez des indices tranchants.
Le plan B est bien. Testez tous les trois et voyez ce qui est le plus rapide et qui donne la fragmentation du moins d'index. Puis décidez si la reconstruction en vaut la peine.