Le temps de reconstruction de l'index dépend-il du niveau de fragmentation?


8

Le temps requis pour la reconstruction d'index dépend-il du niveau de fragmentation?

La reconstruction d'un index fragmenté à 80% prend-elle environ 2 minutes si la reconstruction du même index fragmenté à 40% prend 1 minute?

Je demande le RUNTIME (par exemple en secondes) qui peut être nécessaire pour effectuer l'action requise, et non pas quelle action est requise dans quelle situation particulière. Je connais les meilleures pratiques de base lorsque la réorganisation d'index ou la reconstruction / les mises à jour de statistiques doivent être effectuées.

Cette question ne concerne PAS REORG et la différence entre REORG et REBUILD.

Le contexte: en raison de la configuration de différents travaux de maintenance d'index (chaque nuit, un travail plus lourd le week-end ...), je me demandais si un travail de maintenance d'index OFFLINE quotidien "léger intense" devrait être mieux effectué sur des index fragmentés bas-milieu pour garder le les temps d'arrêt sont petits - ou cela n'a même pas d'importance et la reconstruction sur un index fragmenté à 80% peut prendre le même temps d'arrêt que la même opération sur le même index fragmenté à 40%.

J'ai suivi les suggestions et j'ai essayé de découvrir moi-même ce qui se passait. Ma configuration expérimentale: sur un serveur de test ne faisant RIEN d'autre et n'étant utilisé par personne ou quoi que ce soit d'autre, j'ai créé une table avec un index clusterisé sur une colonne de clé primaire uniqueidentifier avec quelques colonnes supplémentaires et différents types de données [2 chiffres, 9 datetime, et 2 varchar (1000)] et simplement ajouté des lignes. Pour le test présenté, j'ai ajouté environ 305 000 lignes.

Ensuite, j'ai utilisé une commande de mise à jour et mis à jour au hasard une plage de lignes filtrant sur une valeur entière et changé l'une des colonnes VarChar avec une valeur de chaîne changeante pour créer une fragmentation. Après cela, j'ai vérifié le avg_fragmentation_in_percentniveau actuel sys.dm_db_index_physical_stats. Chaque fois que j'ai créé une "nouvelle" fragmentation pour mon benchmark, j'ai ajouté cette valeur, y compris la physical_page_countvaleur à mes enregistrements, le diagramme suivant est fait.

Ensuite, j'ai couru: Alter index ... Rebuild with (online=on); et saisi le CPU timeen utilisant STATISTICS TIME ONdans mes enregistrements.

Mes attentes: je m'attendais à voir au moins l'indication d'une sorte de courbe linéaire qui montre une dépendance entre le niveau de fragmentation et le temps CPU.

Ce n'est pas le cas. Je ne sais pas si cette procédure est vraiment appropriée pour un bon résultat. Peut-être que le nombre de lignes / pages est trop faible?

Cependant, les résultats indiquent que la réponse à ma question d'origine serait certainement NON . Il semble que le temps processeur requis par SQL Server pour reconstruire l'index ne dépend ni du niveau de fragmentation ni du nombre de pages de l'index sous-jacent.

Le premier graphique montre le temps processeur nécessaire pour RECONSTRUIRE l'indice par rapport au niveau de fragmentation précédent. Comme vous pouvez le voir, la ligne moyenne est relativement constante et il n'y a pas du tout de relation entre la fragmentation et le temps de processeur requis observable.

Pour respecter l'influence possible du nombre de pages changeant dans l'index après mes mises à jour qui pourraient nécessiter plus ou moins de temps pour reconstruire, j'ai calculé LE NIVEAU DE FRAGMENTATION * LE COMPTE DES PAGES et j'ai utilisé cette valeur dans le deuxième graphique qui montre la relation entre le temps processeur requis vs fragmentation et nombre de pages.

Fragmentation de l'index et régénération des statistiques de temps CPU

Comme vous pouvez le voir, cela n'indique pas non plus que le temps requis pour reconstruire est influencé par la fragmentation même si le nombre de pages varie.

Après avoir fait ces déclarations, je suppose que ma procédure doit être erronée car le temps de processeur requis pour reconstruire un index énorme et très fragmenté ne peut alors être influencé que par le nombre de lignes - et je ne crois pas vraiment à cette théorie.

Donc, parce que je veux vraiment et définitivement le découvrir maintenant, tout autre commentaire et recommandation est le bienvenu .

Réponses:


2

Le temps requis pour la reconstruction de l'index dépend-il du niveau de fragmentation?

Je crois que ce ne sera pas le paramètre majeur sur lequel SQL Server décidera et prend du temps pour reconstruire \ réorganiser l'index:

Il y a divers autres facteurs impliqués basés sur les "DONNÉES" par lesquels il décide combien de temps cela prendra: Des paramètres comme

Facteur 1: taille du tableau

Facteur 2: Problèmes de disponibilité

Facteur 3: partitionnement

Facteur 4: colonnes d'index et caractère unique

Si vous souhaitez en savoir plus sur ces facteurs, vous pouvez vous référer ici .

Est-ce que la reconstruction d'un index fragmenté à 80% prend environ 2 minutes si la reconstruction du même index fragmenté à 40% prend 1 minute

Encore une fois, la réponse peut être que cela dépend! Pour les chiffres, vous devrez tester le scénario et voir les sorties comment il se passe. Suivez ces détails comme pour le niveau 80 de FRAG, la reconstruction a pris X heures \ minutes \ secondes et pour le niveau de frag 40, la reconstruction a pris Y heures \ minutes \ secondes. Calculez et conservez l'historique, disons sur 15 jours (en fonction de l'activité de maintenance planifiée) et vous pourrez conclure sur le temps qu'il faut réellement pour comparer les deux.

Aditionellement :

Vous pouvez rassembler les données \ calcul sur la progression de la reconstruction de l'index:

soit en utilisant DMV sys.dm_exec_requests OU

Si vous disposez des plans de maintenance d'Ola pour la réindexation et la réorganisation, il existe une option pour enregistrer l'historique des actions effectuées pendant la maintenance dans le tableau CommandLog, comme expliqué dans SQL Server Index and Statistics Maintenance . Une fois les données enregistrées, vous pouvez rechercher le type de commande `ALTER_INDEX - REBUILD 'et la différence pour les mêmes entre les colonnes START TIME et END TIME


@KASQLDBA Je suis entré dans les statistiques / log de la table CommandLog d'Ola. La durée est très très aléatoire et il n'y a aucune relation avec le niveau de fragmentation reconnaissable. Étant donné que je n'ai ces valeurs que dans un environnement de production, le temps requis pour reconstruire pourrait être beaucoup influencé par d'autres processus, ce qui ne semble pas fournir de réponse générale.
Magier

8

Pour toutes les personnes intéressées, j'ai créé un graphique montrant la durée de RECONSTRUCTION de l'index d'environ 2500 reconstructions d'index en quelques semaines en relation avec la fragmentation de l'index et sa taille en pages.

Ces données sont basées sur 10 serveurs SQL, des centaines de tables et sur les procédures d'optimisation d'Ola Hallengren . Le seuil général de reconstruction est fixé à 5% de fragmentation.

J'ai coupé certains des plus grands tableaux (10 Mi + Pages) dans ces statistiques pour le rendre plus lisible.

Le graphique montre le temps requis (durée) en tant que taille des bulles. Les valeurs de la plus grande bulle sont d'environ 220 secondes. Cela montre que le temps requis pour reconstruire un index n'est pas vraiment lié à la fragmentation. Au lieu de cela, il semble être plus dépendant du nombre de pages de l'index. Cela indique également que la fragmentation de bas niveau prend plus de temps que la fragmentation plus élevée. Durée de reconstruction de l'index

Le deuxième graphique est juste zoomé dans la zone <= 200 K Pages. Il montre la même chose, cela prend plus de temps pour les index plus grands, pas pour plus de fragmentation. entrez la description de l'image ici


6

REBUILDde l'indice ne dépend pas de la fragmentation. Il supprime entièrement l'index et le crée à partir de zéro.

REORGANZE index - sert à réduire la fragmentation sans reconstruction d'index, donc pas de suppression et de création.

MS conseille d'utiliser Reorganize pour une fragmentation de 30% ou moins. Pour une fragmentation plus élevée, la reconstruction est préférable.

Voici un article MSDN à ce sujet: Réorganisation et reconstruction des index

MISE À JOUR

En termes de temps nécessaire pour terminer l'opération, cela dépend évidemment de la fragmentation de l'index. La reconstruction d'un index extrêmement fragmenté prendra moins de temps que la réorganisation; la reconstruction d'un index légèrement fragmenté prendra beaucoup plus de temps. Je suggère de prendre les directives MS comme point de départ et d'exécuter des tests sur vos tables. Le seuil de rentabilité en termes de fragmentation% dépendra de la table spécifique, de la taille de l'index et du type de données.


4

La reconstruction d'un index fragmenté à 80% prend-elle environ 2 minutes si la reconstruction du même index fragmenté à 40% prend 1 minute?

L'algorithme pour un REBUILD vs REORG est différent. Un REORG n'allouera PAS de nouvelles extensions par opposition à un RECONSTRUIRE. Un REORG fonctionnera avec les pages actuellement allouées (alloue une page aléatoire de 8 Ko pour qu'il puisse déplacer les pages) et les déplace, puis désalloue les pages si nécessaire.

D'après mes notes internes SQLSkills (anciennement IE0) ....

Pour RECONSTRUIRE:

  • Il peut utiliser plusieurs processeurs - peut tirer parti du parallélisme pour effectuer le travail rapidement.
  • Pour les index fortement fragmentés (par exemple 80% comme dans votre exemple), un REBUILD sera beaucoup plus rapide qu'un REORG. REBUILD créera simplement une autre copie de l'index vs REORG s'enlisera dans la suppression de la fragmentation et sera donc plus lent. C'est la raison pour laquelle Paul Randal a fait sa recommandation générale selon laquelle il serait bon de RECONSTRUIRE un indice fortement fragmenté.
  • Une RECONSTRUCTION vous permettra de changer le mode de récupération en BULK_LOGGED pour une journalisation minimale en générant moins d'enregistrements de journal .

Pour Index REORG:

  • Il s'agit toujours d'un seul thread. Pas de parallélisme.
  • Il est plus lent pour les index fortement fragmentés et plus rapide pour les index légèrement fragmentés. Le coût de création d'un index par rapport à la réorganisation d'un index légèrement fragmenté est plus élevé et, par conséquent, un REORG sera plus rapide pour un index légèrement fragmenté.
  • Un REORG est toujours une opération entièrement enregistrée.

À lire - Notes - Fragmentation, types et solutions d'index SQL Server


Kin, TY pour votre commentaire, mais je pense que vous avez supervisé le cœur de ma question. Vous comparez reorg vs rebuild. J'ai demandé une comparaison entre la reconstruction et la reconstruction pour différents niveaux de fragmentation (ceteris paribus).
Magier

@Magier si vous relisez attentivement ma réponse, elle répond à votre question principale - si un index est fortement fragmenté, reconstruisez-le. Le coût de la reconstruction d'un légèrement fragmenté est bien plus élevé que celui d'une réorganisation. En outre, il n'y a pas de bonne ou de mauvaise façon de traiter la fragmentation en effectuant une reconstruction ou une réorganisation, tout dépend de la disponibilité de votre système, des données, de la taille de l'index, du sous-système d'E / S disque, etc. Vous pouvez également facilement effectuer des tests selon votre environnement. pour comparer reconstruire et reconstruire pour différents niveaux de fragmentation. Tu ne peux pas?
Kin Shah

Je n'ai jamais demandé ou mentionné REORG. Il s'agit de RECONSTRUIRE. Et, oui, bien sûr, je pourrais configurer des tests et essayer de créer des niveaux de fragmentation spécifiques pour savoir combien de temps la reconstruction prendra, mais je voulais voir si quelqu'un le savait déjà et pouvait simplement me dire les résultats attendus de cette approche.
Magier


0

Oui, car généralement, une reconstruction doit analyser l'index d'origine dans l'ordre tout en diffusant les lignes (dans l'ordre) dans une nouvelle partition d'index physique. La fragmentation nuit aux analyses non mises en cache, donc oui, la reconstruction va prendre plus de temps.

La durée dépend de la fragmentation et de la façon dont le processeur est lié à l'ensemble du processus. La sérialisation des lignes est assez gourmande en CPU, donc cela peut ne pas avoir d'importance du tout. Ou, vous obtiendrez peut-être des taux d'E / S aléatoires généralement de 1,5 Mo / s, ce qui est facilement 5 à 10 fois plus lent qu'une reconstruction rapide (dépend du schéma et des données). En fonction des hypothèses que vous faites, vous pouvez probablement créer n'importe quoi entre un ralentissement 1x et 100x.

La reconstruction d'un index fragmenté à 80% prend-elle environ 2 minutes si la reconstruction du même index fragmenté à 40% prend 1 minute?

Ce n'est pas une relation linéaire. La métrique de fragmentation est un proxy très approximatif du temps qu'il faut pour analyser une partition.


@Magier bonne recherche. Le temps CPU n'est jamais affecté par la fragmentation. Vous testez de minuscules tables qui sont entièrement mises en cache en mémoire, donc il n'y a pas du tout d'E / S de lecture. Le test n'est pas valide. Testez avec des tables plus grandes (comme 100 Mo) et faites-le CHECKPOINT; DBCC DROPCLEANBUFFERSavant chaque test. Je suis également intéressé à voir les résultats. J'ai fait une fois un test similaire où j'ai mesuré la vitesse de numérisation en fonction de la fragmentation mais je ne me souviens pas du résultat.
usr

Sachez également que le nombre de fragmentation est en quelque sorte un indicateur lâche, car ce qui compte vraiment, c'est le mouvement de la tête de disque physique. Je peux imaginer beaucoup de modèles d'E / S qui sont raisonnablement rapides mais qui ont une fragmentation à 100% telle que mesurée par SQL Server en utilisant sa définition étroite. Par exemple, le modèle d'allocation 1_2_3_4 où 1-4 est analysé et _ est un trou doit être rapide.
usr

quelle valeur dois-je alors examiner exactement? En fait, j'obtiens les informations suivantes de Rebuild: temps CPU = 0 ms, temps écoulé = 70 ms. Tableau 'tFrag2'. Nombre de scans 4, lectures logiques 512067, lectures physiques 26, lectures anticipées 71209, lob lectures logiques 0, lob lectures physiques 0, lob lectures anticipées lisent 0. SQL Server Execution Times: temps CPU = 8657 ms, temps écoulé = 27246 SP. Temps d'exécution SQL Server: temps CPU = 8657 ms, temps écoulé = 27386 ms.
Magier

Ces temps proviennent-ils de 3 requêtes? C'est un peu déroutant. Vous pouvez dire à partir des premiers chiffres que beaucoup de données sont mises en cache. De plus, 70 ms est trop court pour une référence valide. Pouvez-vous préciser ce que ces chiffres représentent?
usr

Les moments que j'ai mentionnés sont venus de STATISTICS_TIME et STATISTICS_IO. Je vais redémarrer un nouveau benchmark en ce moment et cette fois je veux avoir des résultats corrects. Donc, toute autre suggestion est la bienvenue. Je ne comprends pas ce que le nettoyage du cache de données aide car je suis intéressé à récupérer les données rapidement mais à reconstruire l'index, qu'est-ce qui, afaik, doit être fait sur le disque de toute façon?
Magier
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.