Considérons un index B-tree sur une valeur qui augmentera toujours de façon monotone, par exemple une colonne de type IDENTITY. Avec une implémentation d'arbre B conventionnelle, chaque fois qu'un nœud est plein, il sera divisé à 50% / 50% et nous nous retrouvons avec un arbre B dans lequel (presque) tous les nœuds ne seront pleins qu'à 50%.
Je sais qu'Oracle découvre quand une valeur est en constante augmentation et dans ces cas, Oracle effectue à la place une répartition 90% / 10%. De cette façon, (presque) tous les nœuds seront remplis à 90% et une utilisation de la page bien meilleure est obtenue pour ces cas, assez courants.
Je n'ai pas pu trouver de documentation pour une fonctionnalité similaire dans SQL Server. Cependant, j'ai effectué deux expériences dans lesquelles j'ai inséré N entiers aléatoires et N entiers consécutifs dans un index, respectivement. Le premier cas utilisait bien plus de pages que le second.
SQL Server fournit-il une fonctionnalité similaire? Si oui: pouvez-vous m'indiquer une documentation sur cette fonctionnalité?
MISE À JOUR: Il semble, par les expériences fournies ci-dessous, que les nœuds foliaires sont maintenus non divisés et les nœuds internes sont divisés à 50% / 50%. Cela rend les arbres B sur les clés croissantes plus compacts que sur les clés aléatoires. Cependant, l'approche 90% / 10% par Oracle est encore meilleure, et je cherche toujours de la documentation officielle qui peut vérifier le comportement vu dans les expériences.
la source
Réponses:
S'il ajoute une ligne à la fin de l'index, il allouera simplement une nouvelle page à la ligne plutôt que de diviser la page de fin actuelle. Les preuves expérimentales de ceci sont ci-dessous (utilise la
%%physloc%%
fonction qui nécessite SQL Server 2008). Voir également la discussion ici .Retours (vos résultats varieront)
Cela ne semble cependant s'appliquer qu'aux nœuds feuilles. Cela peut être vu en exécutant ce qui suit et en ajustant la
TOP
valeur. Pour moi,622/623
c'était le point de coupure entre la nécessité d'une et deux pages de premier niveau (peut varier si vous avez activé l'isolement de l'instantané?). Il divise la page de manière équilibrée, ce qui entraîne un gaspillage d'espace à ce niveau.la source
PRIMARY KEY
.DBCC IND
etsys.dm_db_index_physical_stats
pour voir des informations à ce sujet.