2010-03-25 25 views
6

que tiene una mesa con varios índices, varios de los cuales duplican las mismas columnas:base de datos: ¿por qué el emparejamiento

Index 1 columns: X, B, C, D 
Index 2 columns: Y, B, C, D 
Index 3 columns: Z, B, C, D 

No estoy muy bien informado sobre la indexación en la práctica, por lo que me pregunto si alguien puede explicar por qué X, Y y Z se emparejaron con estas mismas columnas. B es una fecha efectiva. C es una identificación de clave semi-única para esta tabla para una fecha de vigencia específica B. D es una secuencia que identifica la prioridad de este registro para el identificador C.

¿Por qué no crear solo 6 índices, uno para cada X? Y, Z, B, C, D?

Quiero agregar un índice a otra columna T, pero en algunos contextos solo estaré consultando en T solo, mientras que en otros también especificaré las columnas B, C y D ... así que debería crear solo un índice como el anterior o debería crear uno para T y uno para (T, B, C, D)?

No he tenido tanta suerte como esperaba cuando busqué en Google una cobertura completa de indexación. ¿Algún recurso donde pueda obtener una explicación exhaustiva y muchos ejemplos de indexación de árbol B?

Respuesta

7

La regla con la indexación es que un índice puede ser utilizado para filtrar en ninguna lista de columnas que constituyen un prefijo de las columnas utilizadas para ese índice.

En otras palabras, podemos usar el Índice 1 cuando filtremos en X y B, o X, B y C, o simplemente X, o las cuatro.

Sin embargo, no podemos usar el índice para filtrar "en el medio". Esto se debe a que los índices no funcionan del todo diferente a la concatenación de los valores de esas columnas para cada fila y a la clasificación del resultado. Si sabemos qué es lo que estamos buscando, podemos averiguar en qué lugar del índice mirar, al igual que cuando hacemos una búsqueda binaria.

Es por eso que un solo índice no es bueno: si necesitamos filtrar en B, C, D y uno de X, Y y Z, necesitamos tres índices; X, Y no sirve como índice para solo filtrar en Y, porque el prefijo de los valores que estamos buscando, la X, no se conoce.

Como mencionó Daniel, un índice de cobertura es una posible explicación para repetir B, C y D: incluso si D nunca se filtra, puede ser que necesitemos exactamente las columnas que ve en sus índices, y luego podemos simplemente leer las columnas del índice en lugar de simplemente usar el índice para ubicar la fila.

+0

En realidad, puede usar un índice para acceder a las columnas "en el medio": Oracle admite omisión de escaneo, por lo que podría usarse un índice en 'X, B, C' para una condición de igualdad en B y C donde X no está presente. Es una razón para considerar la compresión de la clave del índice y liderar el índice con las columnas menos selectivas. –

4

Una razón para tener B, C y D en esos índices podría ser tener un covering index para las consultas de uso frecuente. Tendrá un índice de cobertura cuando el índice en sí contenga todos los campos de datos requeridos para una consulta en particular.

Un índice de cobertura puede acelerar drásticamente la recuperación de datos, ya que solo las páginas de índice, no las páginas de datos, se usarán para recuperar los datos.

continuación se muestra un ejemplo de consulta donde index 1 habría un índice de cobertura:

SELECT B, C, D FROM table WHERE X = '10' 
1

Debería crearlo en (T, B, C, D).

Digamos que tiene dos campos con un índice en una tabla: A y B.Cuando se crea un índice separado en cada una de las columnas, y tiene una consulta, tales como:

SELECT * FROM table WHERE A = 10 AND B = 20 

Lo que pasa es cualquiera:

1) La base de datos crea dos conjuntos de resultados intermedios, uno con filas donde A = 10, y otro con filas donde B = 20. Luego tiene que fusionar estos dos conjuntos de resultados en uno (y también verificar si hay filas duplicadas).

2) El DB crea un conjunto de resultados con filas en las que A = 10. A continuación, tiene que ir manualmente a través de todas las filas en este intermedio conjunto de resultados y comprobar en cada una donde B = 10.

Sin embargo, cuando sabe que el índice B depende del índice A, y su consulta usa A antes que B, puede crear un índice para ambas columnas: (A, B)

Lo que significa que ahora el DB primero encuentre todas las filas donde A = 10, pero como B es parte del mismo índice, puede usar la misma información de índice para filtrar el conjunto de resultados en filas donde B también es 20. No tiene que hacer dos resultados intermedios- establece + fusionarlos, o solo usar uno de los índices y hacer manu al scan para el otro.

Puede haber otras formas en que el DB también resuelva estas situaciones, en gran medida depende de una implementación.

1

Los índices en la forma (X, B, C, D) se puede utilizar para optimizar las consultas como:

... WHERE X rel sthg (possibly ORDER BY B, C, D) 
... WHERE X = sthg AND B rel sthg (possibly ORDER BY C, D) 
... WHERE X = sthf AND B = sthg AND C rel sthg (possibly ORDER BY D) 

etc. donde rel son operadores de relaciones arbitrarias (<,>, =, = < ,> =) y sthg son valores o expresiones. Especialmente los otros dos, y las variantes de clasificación no se optimizarían con la "variante de índices de columna única".

otoh, no se puede optimizar una consulta

... WHERE B = sthg 

ya que se inicia en el medio del índice; aquí, el índice de una sola columna funcionaría.

0

Para obtener un recurso donde puede obtener una explicación completa y muchos ejemplos sobre los índices de Oracle (y cualquier otro problema relacionado con Oracle), debe visitar y marcar askTom.

Cuestiones relacionadas