Pourquoi SQL Server fonctionne-t-il plus rapidement lorsque vous indexez une table après l'avoir remplie?
J'ai une procédure stockée qui met 750K des enregistrements dans une table temporaire par le biais d'une requête de l'une de ses premières actions. Si je créer des index sur la table temp avant de le remplir, l'élément prend environ deux fois plus long à exécuter par rapport à quand je l'indice après le remplissage de la table. (L'index est un entier dans une seule colonne, la table est indexée est juste deux colonnes, chacune d'un nombre entier.)
Cela semble un peu hors de moi, mais je n'ai pas une solide compréhension de ce qui se passe sous le capot. Quelqu'un aurait-il une solution?
source d'informationauteur Dan Blair
Vous devez vous connecter pour publier un commentaire.
Si vous créez un index cluster, il affecte la façon dont les données sont physiquement triés sur le disque. Il est préférable d'ajouter l'index après le fait et de laisser le moteur de base de réorganiser les lignes quand on sait comment les données sont distribuées.
Par exemple, disons que vous avez besoin pour construire un mur de briques avec des briques numérotées de sorte que ceux avec le plus haut nombre sont au bas de la paroi. Ce serait une tâche difficile si vous étiez juste remis les briques dans un ordre aléatoire, un à la fois - vous ne savez pas à qui les briques ont été va être le plus haut numéro, et vous auriez à déchirer le mur vers le bas et de le reconstruire. Il serait beaucoup plus facile de gérer cette tâche si vous aviez toutes les briques alignées en face de vous, et peut organiser votre travail.
Qu'il en est pour le moteur de base de données - si vous le faites savoir à propos de l'ensemble de la tâche, il peut être beaucoup plus efficace que si vous venez de le nourrir d'une ligne à la fois.
C'est parce que le serveur de base de données a pour faire les calculs à chaque fois que vous insérez une nouvelle ligne. En gros, vous vous retrouvez réindexation de la table à chaque fois. Il ne semble pas comme une opération très coûteuse, et il ne l'est pas, mais quand vous n'avez que beaucoup d'entre eux ensemble, vous commencez à voir l'impact. C'est pourquoi vous voulez généralement à l'index une fois que vous avez renseigné vos rangs, car il va juste être un coût ponctuel.
Pensez-y de cette façon.
Liste de ce que pensez-vous est plus facile d'en ajouter?
Btw de la commande de votre entrée avant de charger va vous donner un coup de pouce.
Vous ne devriez JAMAIS JAMAIS de créer un index sur une table vide si vous allez massivement charger tout de suite.
Les index doivent être maintenues, comme les données sur les changements de table, alors imaginez comme si à chaque insert sur la table de l'index a été recalculés (qui est une opération coûteuse).
Chargement de la table de la première et de créer l'index après avoir terminé avec la charge.
C'est là que la différence de performances est en cours.
Après avoir effectué les opérations de manipulation de données de grande taille, souvent, vous devez mettre à jour les indices sous-jacents. Vous pouvez faire cela en utilisant la mise à JOUR des STATISTIQUES [table] déclaration.
L'autre option est de supprimer et recréer l'index qui, si vous faites de grandes insertions de données sera probablement effectuer les insertions beaucoup plus rapide. Vous pouvez même incorporer dans votre procédure stockée.
c'est parce que si les données que vous introduisez est pas dans l'ordre de l'index, SQL devrez découper des pages pour faire de la place pour ajouter des lignes pour les garder ensemble logiquement
- Ce dû au fait que lorsque SQL Server indices de tableau avec des données qu'il est capable de produire des statistiques exactes de valeurs dans la colonne indexée. À certains moments, SQL Server va recalculer les statistiques, mais lorsque vous effectuez massive des inserts de la distribution des valeurs peuvent changer après la statistique a été calculée comme la dernière fois.
Le fait que la statistique est de date peuvent être découverts sur l'Analyseur de Requêtes. Quand vous voyez sur une certaine analyse de la table nombre de lignes attendu diffère beaucoup du nombre réel de lignes traitées.
Vous devez utiliser MISE À JOUR DES STATISTIQUES pour recalculer la distribution des valeurs après l'insertion de toutes les données. Après cela, pas de différence de performances doivent être observés.
Si vous avez un index sur une table, à mesure que vous ajoutez des données à la table SQL Server doivent re-commande de la table pour faire de la place dans l'endroit le plus approprié pour les enregistrements de nouveaux. Si vous ajoutez un grand nombre de données, il faudra réorganiser et recommencer. Par la création d'un index seulement après le chargement des données, l'ordre ne doit se produire une fois.
Bien sûr, si vous importez les enregistrements dans l'ordre d'index, il ne devrait pas beaucoup d'importance.
En plus de l'index de frais généraux, de l'exécution de chaque requête comme une transaction est une mauvaise idée pour la même raison. Si vous exécutez des morceaux de plaquettes (disons 100) dans un délai de 1 transaction explicite, vous devriez également voir une augmentation de la performance.