Dois-je reconstruire l'index après une insertion tronquée / grande?

10

J'ai une procédure stockée qui tronque certaines tables avec environ 1,75 million de lignes dans chacune, avant d'insérer de nouvelles données (basées sur les données d'autres tables, calculs, etc.)

Le plan de base est très simple:

  • Tronquer les tableaux
  • Insérez 1,75 million de lignes dans des «lots» d'environ 75 000 à la fois.

Je me demande si je devrais explicitement reconstruire les index à tout moment dans ce processus? par exemple

  • Tronquer les tableaux
  • ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [ou quelque chose de similaire]
  • Insérer 1,75 million de lignes

ou peut-être

  • ALTER INDEX ALL ON xxx DISABLE
  • Tronquer les tableaux
  • Insérer 1,75 million de lignes
  • ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [ou quelque chose de similaire]

Toute aide appréciée ... pas un DBA - un Dev qui connaît assez bien la DB est plus précis!

BlueChippy
la source
Un peu plus d'informations sur la structure de la table, les index qui existent aujourd'hui et l'apparence des données insérées (est-ce dans un certain ordre? Cela s'aligne-t-il avec l'index clusterisé?) Serait utile. Je suppose également que ce tableau n'est pas disponible tant que ce processus n'est pas terminé? C'est bon à savoir d'avoir des options pour l'importation en masse.
Mike Walsh
Peut-être devriez-vous tronquer l'insertion de table dedans et jeter un œil à votre fragmentation d'index pour voir si vous en avez besoin ou non.
Zane
v: Norme 2008. Les données source sont de multiples tables intermédiaires, avant que ces données ne soient chargées à partir de csv, excel, Oracle et d'autres bases de données SQL. Les structures de table sont toutes identiques à ce stade: 6 caractères ID, 3 caractères code, 10 colonnes décimales (20,5). La clé primaire est ID + Code. Données en cours de chargement insert intoet pour le moment il n'y a pas de order byclause, mais je pourrais ajouter que si cela pouvait aider? L'ID et le code sont également indexés séparément.
BlueChippy

Réponses:

6

Comme pour la plupart des questions de ce type, cela dépend. Il est peu probable que vous insériez les données dans le "bon" ordre pour tous les index impliqués, ce qui signifie que tous ces index sont susceptibles de rencontrer beaucoup de fractionnement de pages pendant le processus d'insertion. Supposons donc que vous insérez dans un ordre d'index cluster. Vous pouvez désactiver tous les index non clusterisés, tronquer, effectuer votre insertion, puis reconstruire tous vos index non clusterisés. Bien sûr, essayer les deux approches vous dira que la vérité est plus rapide quelle que soit la théorie derrière elle. :)

Ben Thul
la source
1

Plan Basic avec tous les index activés peut être lent et entraîner une fragmentation.

ALTER INDEX REBUILD sur une table tronquée et donc vide ne sert à rien, vous devez donc modifier votre plan A. Il doit être:

  • TRONQUER
  • Insérer
  • ALTER INDEX REBUILD

Cela peut encore être lent, mais au moins vous obtenez des index nets.

Le plan B est bien. Testez les trois et voyez lequel est le plus rapide et celui qui donne le moins de fragmentation d'index. Décidez ensuite si la reconstruction en vaut la peine.

Orbilin
la source