j'ai récemment découvert qu'une table de tas avait plus de 70% de fragmentation. J'ai donc décidé de faire un
ALTER TABLE dbo.myTable REBUILD
Assez drôle, après j'ai eu une fragmentation de 20%. Depuis, il n'y a plus eu d'écriture sur cette table. J'ai donc décidé de refaire la reconstruction.
Après la 2ème fois le chapeau de table fragmentation 50% donc encore plus! Je ne comprends vraiment pas comment cela peut arriver ...
sql-server
fragmentation
heap
smoking
la source
la source
Réponses:
Que signifie la fragmentation dans un tas
La valeur de fragmentation dans le tas que vous obtenez à partir de la colonne
avg_fragmentation_in_percent
en interrogeantsys.dm_db_index_physical_stats
DMV indique queEn outre, le même BOL dit que
Vous pouvez donc voir que ce n'est pas l'espace libre présent dans les pages allouées à Heap mais la séquence variable de pages qui crée la fragmentation.
Cela peut être démontré par un petit test. Créons une table de tas et insérons-y quelques enregistrements, puis vérifions la fragmentation.
La table Heap est donc créée avec 50 enregistrements. Voici à quoi ressemble la fragmentation après la requête DMV sys.dm_db_index_physical stats
Vous pouvez voir que la
avg_fragmentation_in_percent
valeur de la colonne est de 33%. Voyons maintenant comment les pages sont organisées. Cela peut être fait en utilisant une requête non documentée%%lockres%%
. La requête seraitEt voici à quoi ressemble la sortie. Joindre seulement une partie pertinente de celui-ci. La requête a produit 50 lignes depuis que nous avons inséré 50 lignes dans notre table dbo.HeapTest.
Ce qu'il dit, c'est que la première page a un ID,
197
la page suivante a un ID,242
les pages suivantes ont un ID continu jusqu'à ce que nous atteignons l'ID de page,264
car après cela, nous obtenons l'ID de la page280
. Donc, ce saut dans les numéros d'identification de page est ce qui cause réellement la fragmentation.Maintenant, de peur de reconstruire le tas et d'exécuter à nouveau la commande pour voir la fragmentation et la disposition des pages. Nous obtenons une fragmentation comme
Vous pouvez voir que la fragmentation est maintenant
14%
.Voyons les numéros de page attribués
Nous n'avons qu'un seul saut, toutes les pages reçoivent un ID de page en série. Depuis un seul saut, la fragmentation a considérablement diminué.
Je reconstruis à nouveau le tas et maintenant, lorsque j'ai vérifié la fragmentation, elle avait complètement disparu. Et l'attribution des ID de page est comme
Pourquoi la fragmentation a augmenté
Maintenant, en ce qui concerne ce qui aurait pu augmenter la fragmentation, nous pouvons corroborer le fait que lorsque les pages étaient allouées au tas, elles ne seraient pas continues, comme vous l'avez vu ci-dessus, ce qui a provoqué l'augmentation de la valeur de la fragmentation a été l'augmentation des ID de PAGE alloués aux pages.
À l'arrière de la tête, vous devez également garder à l'esprit que le mot fragmentation pour HEAP n'a pas de sens, comment définiriez-vous la fragmentation pour un tas de pages non ordonnées.
Vraiment inquiet de la fragmentation
Si vous êtes vraiment confronté à un scénario où la table de segment de mémoire est fragmentée et ralentit les requêtes, il serait préférable de créer un index clusterisé sur la table plutôt que de le reconstruire. La raison en est que lorsque vous reconstruisez le tas, tous les index non cluster sous-jacents sont également reconstruits, ce qui prend beaucoup plus de temps pour le processus de reconstruction, en utilisant beaucoup de ressources et un journal des transactions gonflé. Sur un système de production, on essaierait toujours d'éviter cela. Paul a couvert cela dans sa section Mythe sur le tas .
PS: Veuillez ne pas utiliser de commande non documentée sur le système de production. C'était juste pour la démonstration.
la source
Heaptest
et donner le résultat. Je suis sûr que vous avez peut-être manqué quelque chose. Assurez-vous simplement que le niveau de compatibilité n'est pas 80 dans ce cas, la fonction db_id ne fonctionne pas