Comportement des données dans les index en fonction du facteur de remplissage

14

Supposons que vous ayez une base de données où le facteur de remplissage par défaut est 20. Chaque fois que des données sont insérées, cela crée-t-il uniquement des pages remplies jusqu'à 20%?

D'après ma compréhension, lorsque les données seront insérées, il y aura environ 20% de données dans les pages. Cependant, lorsque les données sont mises à jour, elles s'étendent à plus de 20% de l'index, jusqu'à le remplir et à générer un fractionnement de page, n'est-ce pas?

DForck42
la source

Réponses:

16

Le facteur de remplissage n'entre en jeu que lorsqu'un index est créé ou reconstruit. C'est la quantité de consommation pour l'index des pages de niveau feuille qui sont remplies lors de ces opérations. ( voir la note ci-dessous pour plus de précisions sur les niveaux de page concernés )

Lorsqu'il y a une commande de données (DML à INSERT, UPDATEet / ouDELETE ), il se produira aux indices correspondants concernés. En d'autres termes, si vous avez une page qui est remplie à 20% et que vous insérez des données dans cette page, la page contiendra plus de 20% des données (disons 35%, par exemple). Faites une autre insertion, maintenant la page est remplie à 64%. Reconstruisez l'index et les pages de niveau feuille contiendront désormais relativement le pourcentage d'espace que vous spécifiez (ou implicitement la valeur par défaut pour le serveur).

( Remarque : lorsque vous ne spécifiez PAD_INDEXpas être ON, le facteur de remplissage est uniquement appliqué aux pages de niveau feuille. Mais lorsque vous définissez PAD_INDEX = ON, le facteur de remplissage sera pris en compte pour les pages de niveau intermédiaire de l'index. La valeur par défaut estOFF )

La raison d'ajuster le facteur de remplissage (au lieu d'utiliser la valeur par défaut 100/0) est de sorte que vous minimisiez les fractionnements de page lors de l'insertion ou de la mise à jour des données. Mais gardez à l'esprit que rien n'est gratuit. Plus le facteur de remplissage est faible, plus les données d'espace devraient normalement occuper. Si vous gardez un espace de page libre de 80% pour vos index, ils consommeront une quantité d'espace disque relativement plus importante, ce qui peut conduire à plus de lectures.

D'après ma compréhension, lorsque les données seront insérées, il y aura environ 20% de données dans les pages. Cependant, lorsque les données sont mises à jour, elles s'étendent à plus de 20% de l'index, jusqu'à le remplir et à générer un fractionnement de page, n'est-ce pas?

Lorsque des données sont insérées, elles seront insérées dans les index appropriés sur la page appropriée. Cela pourrait et très probablement entraînerait une consommation de pages supérieure au facteur de remplissage.

Un fractionnement de page se produit lorsque de nouvelles données sont ajoutées à une page d'index complète. SQL Server divisera ensuite la page et placera environ la moitié des données de la page complète dans une nouvelle page. Encore une fois, le facteur de remplissage n'entre pas en jeu ici.

Une raison légitime d'abaisser le facteur de remplissage serait de minimiser les séparations de pages, minimisant ainsi la fragmentation des pages d'index.

Thomas Stringer
la source
3
Il minimise également les opérations d'E / S nécessaires pour augmenter ou allouer de l'espace.
JNK
OK, donc je me trompais sur la façon dont le comportement fonctionnait. Merci pour cette réponse si détaillée!
DForck42
1
@ DForck42 Pas de problème, heureux de vous aider.
Thomas Stringer
Pouvons-nous résumer cela pour dire que la définition d'un facteur de remplissage faible aura tendance à ralentir les lectures (plus de pages) mais à accélérer les insertions (moins de divisions)?
Jon of All Trades
2
@ Jon: Avec des index de remplissage élevés, les fragments et les lectures ralentissent. Pour chaque index, il existe un facteur de remplissage optimal - au-dessus et en dessous, il écrit et lit lentement. L'optimalité dépend des modèles d'utilisation (combien d'insertions par jour), des modèles de maintenance (à quelle fréquence sa reconstruction), des données (à quel point la clé est unique). Les index non uniques nécessitent généralement plus d'espace libre (facteur de remplissage inférieur).
wqw