¿Cuáles son las diferencias entre un índice agrupado y un índice no agrupado?

277

¿Cuáles son las diferencias entre a clusteredy a non-clustered index?

Eric Labashosky
fuente
8
Solo puede tener un índice agrupado por tabla. Pero hay muchas otras diferencias ...
Tom Robinson
55
Un índice agrupado en realidad describe el orden en que los registros se almacenan físicamente en el disco, de ahí la razón por la que solo puede tener uno. Un índice no agrupado define un orden lógico que no coincide con el orden físico en el disco.
Josh
1
Agrupado básicamente significa que los datos están en ese orden físico en la tabla. Es por eso que solo puede tener uno por tabla. Sin agrupar significa que es "solo" un orden lógico.
Biri
2
@biri, ¿qué es el orden "lógico"? un índice no agrupado almacena físicamente las claves de índice y almacena un puntero a la tabla, es decir, la clave de índice agrupado.
Stephanie Page
@Stephanie Page: lógica desde el punto de vista de la tabla. Por supuesto, los índices no agrupados se ordenan físicamente en el índice mismo.
Biri

Respuestas:

268

Índice agrupado

  • Solo uno por mesa
  • Más rápido de leer que no agrupado ya que los datos se almacenan físicamente en orden de índice

Índice no agrupado

  • Se puede usar muchas veces por mesa
  • Más rápido para las operaciones de inserción y actualización que un índice agrupado

Ambos tipos de índice mejorarán el rendimiento cuando se seleccionen datos con campos que usan el índice, pero ralentizarán las operaciones de actualización e inserción.

Debido a la inserción y actualización más lentas, los índices agrupados deben establecerse en un campo que normalmente es incremental, es decir, Id o Marca de tiempo.

SQL Server normalmente solo usará un índice si su selectividad es superior al 95%.

Martynnw
fuente
9
También hay consideraciones de almacenamiento. Al insertar filas en una tabla sin índice agrupado, las filas se almacenan de forma consecutiva en la página y la actualización de una fila puede hacer que la fila se mueva al final de la tabla, dejando un espacio vacío y fragmentando la tabla y los índices.
Jeremiah Peschka
44
no tienes que preocuparte por lo que es x. Todo lo que necesita saber es que para una aplicación con millones de usuarios, x será significativo
Pacerier
14
Es puramente dogma. No es "más rápido de leer porque los datos se almacenan en orden". Es más rápido de leer porque evita una lectura de índice Y LUEGO la tabla lee. Es más rápido escanear el rango (si eso es significativo) porque los datos se almacenan en orden. es decir, el factor de agrupamiento es perfecto.
Stephanie Page
66
Además, la idea de que el 95% de los registros deben ser únicos es una falacia. Digamos que tiene una tabla con 1,000,000 de filas e indexa una columna con 500,000 claves. 0% son únicos, pero cada clave devuelve 2 de un millón de filas. Este índice es absolutamente útil, independientemente de que el 0% de los registros sean únicos.
Stephanie Page
2
"los datos se almacenan físicamente en orden de índice" ¿qué quiere decir con eso? En un nivel, es trivialmente cierto porque las páginas de datos y las páginas de índice son una y la misma, por lo que obviamente el orden de una describe el orden de la otra. Sin embargo, esto no está necesariamente en ningún orden en particular, como el orden de la clave de índice stackoverflow.com/questions/1251636/…
Martin Smith
79

Los índices agrupados ordenan físicamente los datos en el disco. Esto significa que no se necesitan datos adicionales para el índice, pero solo puede haber un índice agrupado (obviamente). Acceder a los datos utilizando un índice agrupado es el más rápido.

Todos los demás índices no deben estar agrupados. Un índice no agrupado tiene un duplicado de los datos de las columnas indexadas que se mantienen ordenados junto con punteros a las filas de datos reales (punteros al índice agrupado si hay uno). Esto significa que el acceso a los datos a través de un índice no agrupado tiene que pasar por una capa adicional de indirección. Sin embargo, si selecciona solo los datos que están disponibles en las columnas indexadas, puede recuperar los datos directamente de los datos de índice duplicados (es por eso que es una buena idea SELECCIONAR solo las columnas que necesita y no usar *)

rslite
fuente
3
'Sin embargo, si selecciona solo los datos que están disponibles en las columnas indexadas, puede recuperar los datos directamente de los datos de índice duplicados', sí, esa es la excepción importante a la heurística de índice agrupado preferido. Supongo que en este caso esencialmente tiene un índice agrupado, pero hay menos datos en la tabla que está consultando, por lo que potencialmente se puede leer más rápido desde el disco.
satnhak
34

Los índices agrupados se almacenan físicamente en la tabla. Esto significa que son los más rápidos y solo puede tener un índice agrupado por tabla.

Los índices no agrupados se almacenan por separado, y puede tener tantos como desee.

La mejor opción es establecer su índice agrupado en la columna única más utilizada, generalmente la PK. Siempre debe tener un índice agrupado bien seleccionado en sus tablas, a menos que sea una razón muy convincente, no puedo pensar en uno solo, pero bueno, puede estar ahí afuera, por no hacerlo.

Santiago Cepas
fuente
3
¿Puedes dar más detalles sobre "siempre debemos tener un índice agrupado en nuestras tablas"? sin entrar en detalles que la declaración es simplemente un error debido a la palabra siempre
Pacerier
1
Tienes razón Pacerier, uno no debería usar declaraciones absolutas a la ligera. Aunque no conozco un solo caso en el que no deba tener un índice agrupado bien seleccionado, tal caso podría existir, así que cambié mi respuesta a una versión más genérica.
Santiago Cepas
28

Índice agrupado

  1. Solo puede haber un índice agrupado para una tabla.
  2. Por lo general, se realiza en la clave principal.
  3. Los nodos hoja de un índice agrupado contienen las páginas de datos.

Índice no agrupado

  1. Solo puede haber 249 índices no agrupados para una tabla (hasta la versión SQL 2005, las versiones posteriores admiten hasta 999 índices no agrupados).
  2. Por lo general, se realiza en cualquier tecla.
  3. El nodo hoja de un índice no agrupado no consta de las páginas de datos. En cambio, los nodos hoja contienen filas de índice.
Jojo
fuente
24

Índice agrupado

  • Solo puede haber un índice agrupado en una tabla
  • Ordene los registros y guárdelos físicamente según el orden
  • La recuperación de datos es más rápida que los índices no agrupados
  • No necesita espacio adicional para almacenar la estructura lógica.

Índice no agrupado

  • Puede haber cualquier número de índices no agrupados en una tabla
  • No afecta el orden físico. Cree un orden lógico para las filas de datos y use punteros para los archivos de datos físicos.
  • La inserción / actualización de datos es más rápida que el índice agrupado
  • Use espacio extra para almacenar la estructura lógica.

Además de estas diferencias, debe saber que cuando la tabla no está agrupada (cuando la tabla no tiene un índice agrupado) los archivos de datos están desordenados y utiliza la estructura de datos del montón como estructura de datos.

Lasitha Yapa
fuente
10

Agrupado básicamente significa que los datos están en ese orden físico en la tabla. Es por eso que solo puede tener uno por tabla.

Sin agrupar significa que es "solo" un orden lógico.

Biri
fuente
9

Pros:

Los índices agrupados funcionan muy bien para rangos (por ejemplo, seleccione * de my_table donde my_key entre @min y @max)

En algunas condiciones, el DBMS no tendrá que hacer un trabajo para ordenar si utiliza una declaración de pedido.

Contras:

Los índices agrupados pueden ralentizar las inserciones porque los diseños físicos de los registros deben modificarse a medida que los registros se introducen si las nuevas claves no están en orden secuencial.

Giovanni Galbo
fuente
6

Un índice agrupado es esencialmente una copia ordenada de los datos en las columnas indexadas.

La principal ventaja de un índice agrupado es que cuando su consulta (búsqueda) localiza los datos en el índice, no se necesitan E / S adicionales para recuperar esos datos.

La sobrecarga de mantener un índice agrupado, especialmente en una tabla actualizada con frecuencia, puede conducir a un bajo rendimiento y, por esa razón, puede ser preferible crear un índice no agrupado.

Ed Guiness
fuente
6

Una base de datos indexada tiene dos partes: un conjunto de registros físicos, que se organizan en un orden arbitrario, y un conjunto de índices que identifican la secuencia en la que se deben leer los registros para obtener un resultado ordenado por algún criterio. Si no hay correlación entre la disposición física y el índice, leer todos los registros en orden puede requerir realizar muchas operaciones de lectura independientes de un solo registro. Debido a que una base de datos puede leer docenas de registros consecutivos en menos tiempo del que tomaría leer dos registros no consecutivos, el rendimiento puede mejorar si los registros que son consecutivos en el índice también se almacenan consecutivamente en el disco.

Por ejemplo, si uno comenzara con una base de datos vacía no agrupada y agregara 10,000 registros en secuencia aleatoria, los registros probablemente se agregarían al final en el orden en que se agregaron. Leer la base de datos en orden según el índice requeriría 10,000 lecturas de un registro. Sin embargo, si se usara una base de datos en clúster, el sistema podría verificar al agregar cada registro si el registro anterior fue almacenado por sí mismo; Si descubriera que ese es el caso, podría escribir ese registro con el nuevo al final de la base de datos. Luego podría mirar el registro físico antes de las ranuras donde solían residir los registros movidos y ver si el registro que siguió estaba almacenado por sí mismo. Si se determina que ese es el caso, podría mover ese registro a ese lugar. El uso de este tipo de enfoque haría que muchos registros se agrupen en pares,

En realidad, las bases de datos agrupadas utilizan algoritmos más sofisticados que este. Sin embargo, una cosa clave a tener en cuenta es que existe una compensación entre el tiempo requerido para actualizar la base de datos y el tiempo requerido para leerla secuencialmente. Mantener una base de datos en clúster aumentará significativamente la cantidad de trabajo necesario para agregar, eliminar o actualizar registros de cualquier manera que afecte la secuencia de clasificación. Si la base de datos se leerá secuencialmente con mucha más frecuencia de la que se actualizará, la agrupación puede ser una gran victoria. Si se actualizará con frecuencia, pero rara vez se lee en secuencia, la agrupación puede ser una gran pérdida de rendimiento, especialmente si la secuencia en la que los elementos se agregan a la base de datos es independiente de su orden de clasificación con respecto al índice agrupado.

Super gato
fuente
5

Un índice agrupado en realidad describe el orden en que los registros se almacenan físicamente en el disco, de ahí la razón por la que solo puede tener uno.

Un índice no agrupado define un orden lógico que no coincide con el orden físico en el disco.

Josh
fuente
2

Es posible que haya pasado por la parte teórica de las publicaciones anteriores:

-El índice agrupado ya que podemos ver los puntos directamente para registrar, es decir, es directo, por lo que lleva menos tiempo realizar una búsqueda. Además, no necesitará memoria / espacio adicional para almacenar el índice

-Mientras, en el índice no agrupado, señala indirectamente al índice agrupado y luego accederá al registro real, debido a su naturaleza indirecta, tomará algo más de tiempo para acceder. También necesita su propia memoria / espacio para almacenar el índice

ingrese la descripción de la imagen aquí

Nandkishor Nangre
fuente
0

// Copiado de MSDN, el segundo punto del índice no agrupado no se menciona claramente en las otras respuestas.

Agrupados

  • Los índices agrupados clasifican y almacenan las filas de datos en la tabla o vista según sus valores clave. Estas son las columnas incluidas en la definición del índice. Solo puede haber un índice agrupado por tabla, porque las filas de datos pueden almacenarse en un solo orden.
  • El único momento en que las filas de datos en una tabla se almacenan en orden ordenado es cuando la tabla contiene un índice agrupado. Cuando una tabla tiene un índice agrupado, la tabla se denomina tabla agrupada. Si una tabla no tiene índice agrupado, sus filas de datos se almacenan en una estructura desordenada llamada montón.

No agrupado

  • Los índices no agrupados tienen una estructura separada de las filas de datos. Un índice no agrupado contiene los valores clave del índice no agrupado y
    cada entrada de valor clave tiene un puntero a la fila de datos que contiene el valor clave.
  • El puntero de una fila de índice en un índice no agrupado a una fila de datos se denomina localizador de fila. La estructura del localizador de filas depende de si las páginas de datos se almacenan en un montón o en una tabla agrupada. Para un montón, un localizador de fila es un puntero a la fila. Para una tabla en clúster, el localizador de filas es la clave de índice en clúster.
Deepak Mishra
fuente