sql >> Base de Datos >  >> RDS >> Oracle

Oracle:¿importa el orden de las columnas en un índice?

  1. Si a y b ambos tienen 1000 valores distintos y siempre se consultan juntos, entonces el orden de las columnas en el índice realmente no importa. Pero si a tiene solo 10 valores distintos o tiene consultas que usan solo una de las columnas, entonces sí importa; en estos escenarios, el índice no se puede usar si el orden de las columnas no se ajusta a la consulta.
  2. La columna con los valores menos distintos debe ser la primera y la columna con los valores más distintos la última. Esto no solo maximiza la utilidad del índice, sino que también aumenta las ganancias potenciales de la compresión del índice.
  3. El tipo de datos y la longitud de la columna tienen un impacto en el rendimiento que podemos obtener de la compresión del índice, pero no en el mejor orden de las columnas en un índice.
  4. Organiza las columnas con la columna menos selectiva primero y la columna más selectiva al final. En el caso de un empate, dirija con la columna que es más probable que se use solo.

La única posible excepción a 2. y 3. es con las columnas FECHA. Debido a que las columnas DATE de Oracle incluyen un elemento de tiempo, pueden tener 86400 valores distintos por día . Sin embargo, la mayoría de las consultas en una columna de datos generalmente solo están interesadas en el elemento del día, por lo que es posible que desee considerar solo la cantidad de días distintos en sus cálculos. Aunque sospecho que no afectará la selectividad relativa en solo un puñado de casos.

editar (en respuesta al comentario de Nick Pierpoint)

Las dos razones principales para comenzar con la columna menos selectiva son

  1. Compresión de índice
  2. Omitir lecturas de índice

Ambos hacen su magia al saber que el valor en la ranura actual es el mismo que el valor en la ranura anterior. En consecuencia, podemos maximizar el rendimiento de estas técnicas minimizando el número de veces que cambia el valor. En el siguiente ejemplo, A tiene cuatro valores distintos y B tiene seis. Los ídems representan un valor comprimible o un bloque de índice saltable.

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

Los encabezados de columna más selectivos...

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

Incluso en este ejemplo trivial, (A, B) tiene 20 espacios saltables en comparación con los 18 de (B, A) . Una disparidad más amplia generaría un mayor ROI en la compresión de índices o una mejor utilidad de las lecturas de Index Skip.

Como es el caso con la mayoría de las heurísticas de ajuste, necesitamos comparar usando valores reales y volúmenes realistas. Este es definitivamente un escenario donde el sesgo de datos podría tener un impacto dramático en la efectividad de diferentes enfoques.

"Creo que si tiene un primer índice altamente selectivo, desde una perspectiva de rendimiento, hará bien en ponerlo en primer lugar".

Si tenemos una columna altamente selectiva, entonces deberíamos crear un índice propio. Es poco probable que los beneficios adicionales de evitar una operación FILTER en un puñado de filas se vean superados por la sobrecarga de mantener un índice compuesto.

Los índices de varias columnas son más útiles cuando tenemos:

  • dos o más columnas de selectividad media,
  • que se utilizan con frecuencia en la misma consulta.