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

Oracle :l'ordre des colonnes est-il important dans un index ?

  1. Si a et b les deux ont 1000 valeurs distinctes et ils sont toujours interrogés ensemble, alors l'ordre des colonnes dans l'index n'a pas vraiment d'importance. Mais si a n'a que 10 valeurs distinctes ou si vous avez des requêtes qui n'utilisent qu'une seule des colonnes, cela a de l'importance ; dans ces scénarios, l'index peut ne pas être utilisé si l'ordre des colonnes ne convient pas à la requête.
  2. La colonne avec les valeurs les moins distinctes doit être la première et la colonne avec les valeurs les plus distinctes en dernier. Cela permet non seulement de maximiser l'utilité de l'index, mais aussi d'augmenter les gains potentiels de la compression d'index.
  3. Le type de données et la longueur de la colonne ont un impact sur le rendement que nous pouvons obtenir de la compression d'index, mais pas sur le meilleur ordre des colonnes dans un index.
  4. Organisez les colonnes avec la colonne la moins sélective en premier et la colonne la plus sélective en dernier. En cas d'égalité, avancez avec la colonne qui est plus susceptible d'être utilisée seule.

La seule exception potentielle à 2. et 3. concerne les colonnes DATE. Étant donné que les colonnes Oracle DATE incluent un élément de temps, elles peuvent avoir 86 400 valeurs distinctes par jour . Cependant, la plupart des requêtes sur une colonne de données ne s'intéressent généralement qu'à l'élément jour, vous pouvez donc ne considérer que le nombre de jours distincts dans vos calculs. Bien que je soupçonne que cela n'affectera la sélectivité relative que dans une poignée de cas.

modifier (en réponse au commentaire de Nick Pierpoint)

Les deux principales raisons de mener avec la colonne la moins sélective sont

  1. Compression d'index
  2. Index Ignorer les lectures

Ces deux éléments opèrent leur magie en sachant que la valeur de l'emplacement actuel est la même que la valeur de l'emplacement précédent. Par conséquent, nous pouvons maximiser le rendement de ces techniques en minimisant le nombre de fois où la valeur change. Dans l'exemple suivant, A a quatre valeurs distinctes et B en a six. Les dittos représentent une valeur compressible ou un bloc d'index désactivable.

Least selective column leads ...

A          B
---------  -
AARDVARK   1
"          2
"          3
"          4
"          5
"          6
DIFFVAL    1
"          2
"          3
"          4
"          5
"          6
OTHERVAL   1
"          2
"          3
"          4
"          5
"          6
WHATEVER   1
"          2
"          3
"          4
"          5
"          6

Leads de colonne les plus sélectifs ...

B  A
-  --------
1  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
2  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
3  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
4  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
5  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
6  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER

Même dans cet exemple trival, (A, B) a 20 emplacements désactivables par rapport aux 18 de (B, A) . Une plus grande disparité générerait un meilleur retour sur investissement sur la compression d'index ou une meilleure utilité à partir des lectures de saut d'index.

Comme c'est le cas avec la plupart des heuristiques de réglage, nous devons comparer en utilisant des valeurs réelles et des volumes réalistes. Il s'agit certainement d'un scénario dans lequel le biais des données pourrait avoir un impact considérable sur l'efficacité des différentes approches.

"Je pense que si vous avez un premier indice très sélectif, alors - du point de vue des performances - vous feriez bien de le mettre en premier."

Si nous avons une colonne hautement sélective, nous devrions en faire son propre index. Il est peu probable que les avantages supplémentaires d'éviter une opération FILTER sur une poignée de lignes soient compensés par la surcharge de maintenance d'un index composite.

Les index multi-colonnes sont plus utiles lorsque nous avons :

  • deux ou plusieurs colonnes de sélectivité moyenne,
  • qui sont fréquemment utilisés dans la même requête.