Oracle
 sql >> Base de données >  >> RDS >> Oracle

la colonne incrémentée rend-elle l'index b-tree sur la colonne déséquilibré?

Oracle Les index de ne sont jamais "déséquilibrés" :chaque feuille de l'index est à la même profondeur que n'importe quelle autre feuille.

Aucune division de page n'introduit un nouveau niveau en soi :une page feuille ne devient pas un parent pour de nouvelles pages comme elle le serait sur un arbre non auto-équilibré.

Au lieu de cela, un frère pour la page fractionnée est créé et le nouvel enregistrement (plus éventuellement certains des enregistrements de l'ancienne page) va à la nouvelle page. Un pointeur vers la nouvelle page est ajouté au parent.

Si la page parent manque également d'espace (ne peut pas accepter le pointeur vers la page feuille nouvellement créée), elle est également divisée, et ainsi de suite.

Ces divisions peuvent se propager jusqu'à la page racine, dont la division est la seule chose qui augmente la profondeur de l'index (et le fait pour toutes les pages à la fois).

Les pages d'index sont en outre organisées en listes à double lien, chaque liste à son propre niveau. Ce serait impossible si l'arbre était déséquilibré.

Si master_id est auto-incrémenté cela signifie que tous les fractionnements se produisent à la fin (appelé 90/10 splits) ce qui rend l'index le plus dense possible.

Non, ce ne serait pas le cas, pour les raisons ci-dessus.

Si vous rejoignez slave à master souvent, vous pouvez envisager de créer un CLUSTER des deux tables, indexées par master_id . Cela signifie que les enregistrements des deux tables, partageant le même master_id , accédez aux mêmes pages de données ou à proximité, ce qui permet de les joindre très rapidement.

Lorsque le moteur a trouvé un enregistrement de master , avec un index ou quoi que ce soit, cela signifie également qu'il a déjà trouvé les enregistrements de slave être joint à ce master . Et vice versa, localiser un slave signifie également localiser son master .