2009-04-27 21 views
49

He creado índices compuestos (índices para usted) en las tablas anteriores con una suposición de cómo funcionaban. Solo tenía curiosidad si mi suposición es correcta o no.¿Cómo funcionan los índices compuestos?

Supongo que cuando enumera el orden de las columnas para el índice, también está especificando cómo se agruparán los índices. Por ejemplo, si usted tiene columnas a, b, y c, y especifica el índice en ese mismo orden a ASC, b ASC, y c ASC entonces el índice resultante será esencialmente muchos índices para cada "grupo" en a.

¿Es esto correcto? Si no, ¿cómo se verá realmente el índice resultante?

+0

Consulte aquí: [SQL Server que cubre los índices] (http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/sql-server-covering-indexes) para obtener una buena explicación – SQLMenace

+0

Esto parece un compuesto índice para mí CREAR INDICE NO CLASIFICADO idx_PeopleTest_Name_Id_FavoriteColor ON PeopleTest (Name, Id, FavoriteColor) – SQLMenace

Respuesta

54

Los índices compuestos funcionan igual que los índices normales, excepto que tienen claves de valores múltiples.

Si define un índice en los campos (a, b, c), los registros se ordenan primero en a, luego b, luego c.

Ejemplo:

| A | B | C | 
------------- 
| 1 | 2 | 3 | 
| 1 | 4 | 2 | 
| 1 | 4 | 4 | 
| 2 | 3 | 5 | 
| 2 | 4 | 4 | 
| 2 | 4 | 5 | 
+7

Tenga en cuenta también que los índices se almacenan como Btree, por lo que un índice (a, b, c) ayudará en una búsqueda en (a) y en (a, b), pero * no * en otras búsquedas como (b) o (antes de Cristo). – aexl

3

No. El índice resultante será de índice único pero con la clave compuesta.

KeyX = A, B, C, D; KeyY = 1,2,3,4;

Índice KEYX, Keyy será realidad: A1, A2, A3, B1, B3, C3, C4, D2

Para que en caso de tener que encontrar algo por KEYX y Keyy - que será rápido y usará un solo índice. Algo así como SELECT ... DONDE KeyX = "B" AND KeyY = 3.

Pero es importante entender: WHERE KeyX =? solicitudes usan ese índice, mientras WHERE KeyY =? será NO usar tal índice en absoluto.

+0

La última afirmación no es verdadera en Oracle. Consulte http://stackoverflow.com/questions/57878/sql-oracle-when-indexes-on-multiple-columns-can-be-used (ignore la respuesta incorrecta). – Hobo

+0

@Hobo: 1. En la mayoría de los RDBMS, la exploración de omisión no está disponible. 2. En la mayoría de las situaciones, sería MUY lento, solo un poco más rápido (y, a veces, incluso más lento) que la simple exploración de tabla (en situaciones muy raras, realmente será útil). No hay magia en Oracle. Solo una buena regla para recordar: NO confíe en el índice compuesto si sus criterios no utilizan solo columnas de primer nivel del índice (es un error muy común crear índices compuestos grandes). – Mash

+0

@Mash Puntos tomados.Definitivamente no dice que los escaneos salteados son una bala de plata, solo que hay circunstancias donde KeyY =? _will_ usar un índice. Pensé que es mejor dar una imagen lo más completa posible. En cuanto a la velocidad, esperamos que el optimizador escoja el enfoque apropiado (aunque, como siempre, mediría en lugar de asumir en caso de duda) – Hobo

17

La aplicación más común de los índices usa árboles B para permitir operaciones de búsqueda un tanto rápidos, y también exploraciones razonablemente rápidos alcance. Es demasiado para explicarlo aquí, pero aquí está el artículo de Wikipedia en B-trees. Y tiene razón, la primera columna que declara en el índice de creación será la columna de orden superior en el árbol B resultante.

Una búsqueda en la columna de orden superior equivale a un análisis de rango, y un índice B-tree puede ser muy útil para dicha búsqueda. La forma más fácil de ver esto es por analogía con los catálogos de tarjetas antiguas que tiene en bibliotecas que aún no se han convertido a catálogos en línea.

Si busca todas las tarjetas para Autores cuyo apellido es "Clemens", vaya al catálogo del autor y encuentre rápidamente un cajón que diga "CLE-CLI" en el frente. Ese es el cajón correcto. Ahora haces una especie de búsqueda binaria informal en ese cajón para encontrar rápidamente todas las cartas que dicen "Clemens, Roger" o "Clemens, Samuel" en ellas.

Pero supongamos que quiere encontrar todas las tarjetas para los autores cuyo nombre es "Samuel". Ahora estás en el arroyo, porque esas cartas no están reunidas en un solo lugar en el catálogo de Autor. Un fenómeno similar ocurre con los índices compuestos en una base de datos.

Diferentes DBMS se diferencian en cuán ingenioso es su optimizador para detectar escaneos de rango de índice y estimar con precisión su costo. Y no todos los índices son B-trees. Tendrás que leer los documentos de tu DBMS específico para obtener la información real.

+0

gracias, he estado pensando mucho en este problema, sin una respuesta clara. "Una búsqueda en la columna de orden superior equivale a una exploración de rango", pero ¿qué sucede si el índice cubre 2 columnas y ambas columnas se especifican en una consulta de rango, como "Columna A umbral 2 Y columna B threshold4 ", parece que Oracle tendría que gastar MÚLTIPLES escaneos de rango en el B-tree, ¿verdad? luego, en caso de que tengamos muchas columnas en el índice compuesto, tenemos que hacer MUCHAS escaneos de rango, y la efectividad del índice se reduce en gran medida –

+0

En mi respuesta, quise decir que Columna A = valor equivale a un escaneo de rango, porque puede haber muchos las entradas que tienen el valor correcto para ColumnA pero valores diferentes para ColumnB. El caso que describes es bastante diferente. Todavía podría ser un análisis de rango, pero el rango podría implicar un gran porcentaje de las entradas en el índice. Cuanto mayor sea el rango, menos ahorrará el índice. Si el valor de usar el índice cae demasiado bajo, el optimizador puede optar por una estrategia diferente. –

28

Índice compuesto es como un índice alfabeto normal en un diccionario, sino que abarca dos o más letras, como este:

AA - page 1 
AB - page 12 

etc.

Las filas de tabla están clasificadas primero por la primera columna en el índice, luego por el segundo, etc.

Se puede usar cuando busca por ambas columnas O por la primera columna. Si el índice es la siguiente:

AA - page 1 
AB - page 12 
… 
AZ - page 245 
BA - page 246 
… 

se puede usar para buscar en 2 letras (= 2 columnas en una tabla), o como un índice normal en una carta:

A - page 1 
B - page 246 
… 

Nótese que en caso de un diccionario, las páginas mismas están ordenadas alfabéticamente. Ese es un ejemplo de un índice CLUSTERED.

En una llanura, no CLUSTERED índice, las referencias a las páginas están clasificadas, como en un libro de historia:

Gaul, Alesia: pages 12, 56, 78 
Gaul, Augustodonum Aeduorum: page 145 
… 
Gaul, Vellaunodunum: page 24 
Egypt, Alexandria: pages 56, 194, 213, 234, 267 

Los índices compuestos también se pueden utilizar cuando se ORDER BY dos o más columnas. En este caso, una cláusula DESC puede ser útil.

Ver este artículo en mi blog sobre el uso de DESC cláusula en un índice compuesto:

0

Mi opinión es, índices compuestos funcionan igual que los índices regulares, excepto que tienen valores múltiples llaves. Si define un índice en los campos (a, b, c), dado que el índice compuesto se almacenará en un BinaryTree, su índice funcionará solo siguiendo combinaciones de búsquedas.

ABC 
AB 
A 

Por ejemplo la creación de un índice compuesto para a, b y c campo es equivalente a la creación de índices separados para a, ab, y ABC.