Índices Múltiples vs Índices de Varias Columnas


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 múltiples columnas sobre tener 1 índice por columna que desea indexar.

¿Hay ciertas razones por las que uno debe usarse sobre el otro?

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)
Author: GateKiller, 2008-10-07

6 answers

Estoy de acuerdo con Cade Roux.

Este artículo debería llevarte por el camino correcto:

Una cosa a tener en cuenta, los índices agrupados deben tener una clave única (una columna de identidad que recomendaría) como primera columna. Básicamente ayuda a que sus datos se inserten al final del índice y no causan muchos IO de disco y División de páginas.

En segundo lugar, si está creando otros índices en sus datos y se construyen inteligentemente, se reutilizarán.

Por ejemplo, imagine que busca una tabla en tres columnas

Estado, condado, código postal.

  • a veces se busca solo por estado.
  • a veces se busca por estado y condado.
  • usted busca frecuentemente por estado, condado, código postal.

Luego un índice con state, county, zip. se utilizará en los tres de estos búsqueda.

Si busca bastante por zip solo, entonces el índice anterior no será utilizado (por SQL Server de todos modos) ya que zip es la tercera parte de ese índice y el optimizador de consultas no verá ese índice como útil.

Entonces podría 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 sus by de grupo.

El artículo ayudará a un mucho. :-)

 246
Author: evilhomer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:36

Sí. Te recomiendo que revises Los artículos de Kimberly Tripp sobre indexación.

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 forman parte de la clave, lo que puede eliminar los viajes al resto de la fila.

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

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

 63
Author: Cade Roux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-19 19:45:04

El índice de varias columnas se puede usar para consultas que hacen referencia a todas las columnas:

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

Esto se puede buscar directamente usando el índice de varias columnas. Por otro lado, a lo sumo se puede usar uno de los índices de una sola columna (tendría que buscar todos los registros que tengan Column1=1, y luego verificar Column2 y Column3 en cada uno de ellos).

 31
Author: MobyDX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 15:46:51

Un elemento que parece haberse perdido son las transformaciones de estrellas. Index Intersection Los operadores resuelven el predicado calculando el conjunto de filas alcanzadas por cada uno de los predicados antes de que se realice cualquier E/S en la tabla de hechos. En un esquema star 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 de índices. Los índices en columnas individuales dan la mejor flexibilidad para esto.

 13
Author: ConcernedOfTunbridgeWells,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 19:19:31

Si tiene consultas que usarán con frecuencia un conjunto relativamente estático de columnas, crear un único índice de cobertura que las incluya todas mejorará drásticamente 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 el almacenamiento de datos. La desventaja es que hacer esto puede costar una gran cantidad de gastos generales, especialmente si los datos son muy volátiles.

Creando los índices en columnas simples son útiles para las operaciones de búsqueda que se encuentran con frecuencia en los sistemas OLTP.

Deberías preguntarte por qué estás indexando las columnas y cómo se usarán. Ejecute algunos planes de consulta y vea cuándo se accede a ellos. El ajuste del índice es tanto instinto como ciencia.

 5
Author: Bob Probst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 15:46:19

El libro de Lahdenmaki y Leach "Relational Database Index Design and the Optimizers" introduce un sistema de tres estrellas para calificar cuán adecuado es un índice para una consulta.

  1. El índice gana una estrella si coloca filas relevantes adyacentes entre sí
  2. una segunda estrella si sus filas están ordenadas en el orden que la consulta necesita
  3. una estrella final si contiene todas las columnas necesarias para la consulta

Crear múltiples índices en columnas, esta estrategia de indexación a menudo resultados cuando las personas dan consejos vagos pero que suenan autoritarios como " crear índices en las columnas que aparecen en la cláusula WHERE."Este consejo está muy equivocado. Dará lugar a índices de una estrella en el mejor de los casos. Estos índices pueden ser muchos órdenes de magnitud más lentos que los índices verdaderamente óptimos. A veces, cuando no se puede diseñar un índice de tres estrellas, es mucho mejor ignorar la cláusula WHERE y prestar atención al orden óptimo de las filas o crear un índice de cobertura en su lugar.

 0
Author: hechen0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-15 13:23:46