2010-02-04 25 views
19

un índice en dos columnas se puede crear con cualquiera de las declaracionesOracle: ¿importa el orden de las columnas en un índice?

create index foo_ix on foo(a,b); 
create index foo_ix on foo(b,a); 
  1. ¿Cómo afecta esto a los (tiempo de ejecución) Las características de funcionamiento de la utilización del índice?

  2. ¿Cómo afecta esto a las características de diseño (físicas) del índice?

  3. ¿Están afectados (1) o (2) los tipos/tamaños de las columnas?

  4. ¿Cuáles son las mejores prácticas para crear índices de varias columnas?

En resumen, ¿importa qué columna coloco primero?

Respuesta

19
  1. Si a y ambos tienen b 1000 valores distintos y siempre se consultan entre sí, entonces el orden de las columnas en el índice no hace realmente importar. Pero si a tiene solo 10 valores distintos o si 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 definidos debe ser la primera y la columna con los valores más distintos duran. 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 retorno que podemos obtener de la compresión del índice, pero no en el mejor orden de columnas en un índice.
  4. Organice primero las columnas con la columna menos selectiva y la columna más selectiva. En el caso de una ventaja de lazo con la columna que es más probable que se use por sí mismo.

La única excepción potencial a 2. y 3. es con columnas de FECHA. Como las columnas de Oracle DATE 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 día, por lo que es posible que desee considerar solo el número de días distintos en sus cálculos. Aunque sospecho que no afectará la selectividad relativa en un puñado de casos.

de edición (en respuesta al comentario de Nick Pierpoint)

Las dos razones principales para que conduce a la columna menos selectiva son

  1. compresión Índice
  2. Índice Skip lee

Ambos funcionan 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 dittos representan un valor comprimible o un bloque de índice omitible.

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 

columna más selectivas conduce ...

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 ranuras se pueden omitir en comparación con el 18 de (B, A). Una disparidad más amplia generaría un mayor retorno de la inversión en la compresión del índice o una mejor utilidad de las lecturas de Indice de omisión.

Como es el caso con la mayoría de las heurísticas de ajuste, tenemos que comparar con valores reales y volúmenes realistas. Este es definitivamente un escenario en el que la distorsión de los datos podría tener un impacto dramático en la efectividad de los diferentes enfoques.


"Creo que si usted tiene un primer índice altamente selectivo y luego - desde una perspectiva de rendimiento - que va a hacer bien a ponerlo en primer lugar."

Si tenemos una columna altamente selectiva, debemos construirla como un índice propio. Los beneficios adicionales de evitar una operación de FILTRO en un puñado de filas es poco probable que se vean superados por la sobrecarga de mantener un índice compuesto.

índices Multi-columna son más útiles cuando tenemos:

  • dos o más columnas de selectividad mediocre,
  • que se utiliza con frecuencia en la misma consulta.
+0

Hola. No tengo claro tu punto 4. ¿Puedes explicarlo? En general, pondría primero la columna * most * selectiva. Solo puse la columna menos selectiva primero cuando pensé que un histograma podría llevar a la CBO a omitir el índice por completo. –

+0

Gracias por la edición adicional de APC: dejó bien claro su punto. Su comentario sobre la necesidad de realizar un benchmark está bien hecho. Creo que si tienes un primer índice altamente selectivo, entonces, desde una perspectiva de rendimiento, harás bien en ponerlo primero. Punto de referencia ... punto de referencia ... punto de referencia ... –

3
  1. si una columna se usa sola en una consulta Oracle va a utilizar una menor eficiente camino omitir acceso índice de barrido si no es la columna que conduce en el índice
  2. depende de la respectivo selectividad de las columnas
  3. sin
  4. me gustaría ver las consultas que implican las columnas en el índice y clasificar su posición en el índice más fuertemente cuestionado
4

Pero según la propia Oracle, es mejor poner la columna con la más alta cardinalidad primera:

http://docs.oracle.com/cd/B10500_01/server.920/a96533/data_acc.htm#2174

Claves de pedido de los Índices Compuestos

Si se utilizan todas las claves en las cláusulas WHERE con la misma frecuencia, ordenar estas claves de la más selectiva a la menos selectiva en la sentencia CREATE INDEX mejora el rendimiento de la consulta.

Cuestiones relacionadas