2008-10-07 17 views
456

Acabo de agregar un índice a una tabla en SQL Server 2005 y me hizo pensar. ¿Cuál es la diferencia entre crear 1 índice y definir varias columnas sobre tener 1 índice por columna que desea indexar?Índices múltiples frente a índices de varias columnas

¿Existen ciertas razones por las cuales una debería usarse sobre la otra?

Por ejemplo

Create NonClustered Index IX_IndexName On TableName 
(Column1 Asc, Column2 Asc, Column3 Asc) 

Versus

Create NonClustered Index IX_IndexName1 On TableName 
(Column1 Asc) 

Create NonClustered Index IX_IndexName2 On TableName 
(Column2 Asc) 

Create NonClustered Index IX_IndexName3 On TableName 
(Column3 Asc) 

Respuesta

224

Estoy de acuerdo con Cade Roux.

En este artículo se debe conseguir que en el camino correcto:

Una cosa a destacar, los índices agrupados debe tener una clave única (una columna de identidad lo recomiendo) como la primera columna. Básicamente ayuda a su inserción de datos al final del índice y no causa muchas divisiones de IO y páginas de disco.

En segundo lugar, si está creando otros índices en sus datos y están construidos inteligentemente, serán reutilizados.

p. Ej. imagine que busca una tabla en tres columnas

estado, condado, código postal.

  • a veces busca por estado solamente.
  • a veces busca por estado y condado.
  • busca con frecuencia por estado, condado, código postal.

Luego, un índice con estado, condado, código postal. se usará en las tres búsquedas.

Si realiza una búsqueda por zip solo bastante, no se utilizará el índice anterior (de todos modos, SQL Server) ya que zip es la tercera parte de ese índice y el optimizador de consultas no lo verá útil.

Puede crear un índice solo en Zip que se usaría en esta instancia.

Supongo que la respuesta que está buscando es que depende de sus cláusulas where de sus consultas de uso frecuente y también de su grupo by's.

El artículo ayudará mucho. :-)

+1

El enlace sqlskills.com está roto - Error del servidor en la aplicación '/ BLOGS/KIMBERLY'. –

+2

Parece que se ha movido a http://www.sqlskills.com/BLOGS/KIMBERLY/post/Indexes-in-SQL-Server-20052008-Best-Practices-Part-1.aspx – jball

+2

Er, aquí está el enlace permanente de Perma : http://www.sqlskills.com/BLOGS/KIMBERLY/post.aspx?id=19f0ce1c-0d2f-4ad5-9b13-a615418422e0 – jball

56

Sí. Te recomiendo que revises Kimberly Tripp's articles on indexing.

Si un índice está "cubriendo", entonces no hay necesidad de usar nada más que el índice. En SQL Server 2005, también puede agregar columnas adicionales al índice que no son parte de la clave, lo que puede eliminar viajes al resto de la fila.

Tener múltiples índices, cada uno en una sola columna puede significar que solo se usa un índice en absoluto. Tendrá que consultar el plan de ejecución para ver qué efectos ofrecen los diferentes esquemas de indexación.

También puede usar el asistente de ajuste para ayudar a determinar qué índices harían que una determinada consulta o carga de trabajo obtuviera el mejor rendimiento.

+4

Kimberly Tripp sabe de lo que está hablando. Estuve hablando de ella y ella sabe todo esto al revés. Un gran consejo. – evilhomer

+0

¿Te refieres a SQL Server 2005? ¿O se refiere a alguna versión del lenguaje SQL con el que no estoy familiarizado? –

+0

SQL Server 2005, respuesta corregida. –

5

Si tiene consultas que utilizarán con frecuencia un conjunto de columnas relativamente estáticas, la creación de un único índice de cobertura que las incluya mejorará notablemente el rendimiento.

Al poner varias columnas en su índice, el optimizador solo tendrá que acceder a la tabla directamente si una columna no está en el índice. Los uso mucho en data warehousing. La desventaja es que hacer esto puede costar muchos gastos generales, especialmente si los datos son muy volátiles.

La creación de índices en columnas individuales es útil para las operaciones de búsqueda que se encuentran con frecuencia en los sistemas OLTP.

Debe preguntarse por qué indexa las columnas y cómo se usarán. Ejecute algunos planes de consulta y vea cuándo se está accediendo a ellos. El ajuste del índice es tanto instinto como ciencia.

30

El índice de varias columnas se puede utilizar para las consultas que hacen referencia a todos los las columnas:

SELECT * 
FROM TableName 
WHERE Column1=1 AND Column2=2 AND Column3=3 

Esto se puede consultar directamente utilizando el índice de varias columnas. Por otro lado, se puede utilizar como máximo uno de los índices de una sola columna (tendría que buscar todos los registros que tengan Columna1 = 1, y luego verificar Columna2 y Columna3 en cada uno de ellos).

+18

This es correcto. Sin embargo, tener estas columnas como un solo índice, cada una de ellas aceleraría las cosas dramáticamente. Por lo general, uno de los valores en las columnas reducirá el conjunto resultante tanto que no importa buscar el resto sin un índice y el optimizador es bueno para elegir este valor. – TToni

10

Un elemento que parece haberse perdido es las transformaciones en estrella. Los operadores Index Intersection resuelven el predicado calculando el conjunto de filas afectadas por cada uno de los predicados antes de que se realice cualquier E/S en la tabla de hechos. En un esquema en estrella indexaría cada clave de dimensión individual y el optimizador de consultas puede resolver qué filas seleccionar mediante el cálculo de intersección del índice. Los índices en columnas individuales brindan la mejor flexibilidad para esto.

+0

+1 para la buena explicación vinculada de cómo se usan los índices (ordinarios), relevantes para la pregunta. – RobM

Cuestiones relacionadas