Pregunta

¿Cuáles son los diferentes tipos de índices, cuáles son los beneficios de cada uno?

He oído hablar de índices de cobertura y agrupados, ¿hay más? ¿Dónde los utilizarías?

¿Fue útil?

Solución

  • Único: garantiza valores únicos para la columna (o conjunto de columnas) incluida en el índice
  • Cobertura: incluye todas las columnas que se utilizan en una consulta particular (o conjunto de consultas), lo que permite que la base de datos use solo el índice y no tenga que mirar los datos de la tabla para recuperar los resultados
  • Agrupado: esta es la forma en que los datos reales se ordenan en el disco, lo que significa que si una consulta utiliza el índice agrupado para buscar los valores, no tiene que tomar el paso adicional de buscar la fila de la tabla real para cualquier dato no incluido en el índice.

Otros consejos

OdeToCode tiene un buen artículo que cubre las diferencias básicas

Como dice el artículo:

  

Los índices apropiados son cruciales para el bien   Rendimiento en grandes bases de datos.   A veces se puede compensar un mal   Consulta escrita con un buen índice, pero   Puede ser difícil compensar a los pobres   indexación incluso con las mejores consultas.

Muy cierto, también ... Si está empezando a hacerlo, me centraré en los índices agrupados y compuestos, ya que probablemente sean lo que más use.

Añadiré un par de tipos de índice

BITMAP: cuando tiene un número muy bajo de diferentes valores posibles, muy rápido y no ocupa mucho espacio

PARTITIONED: permite que el índice se particione en función de alguna propiedad que generalmente es ventajosa en objetos de bases de datos muy grandes por razones de almacenamiento o rendimiento.

Índices de FUNCIÓN / EXPRESIÓN: se utilizan para precalcular un valor en función de la tabla y almacenarlo en el índice; un ejemplo muy simple podría ser un índice basado en la función de subcadena o inferior ().

PostgreSQL permite índices parciales, donde solo se indexan las filas que coinciden con un predicado. Por ejemplo, es posible que desee indexar la tabla de clientes solo para aquellos registros que están activos. Esto podría parecer algo como:

create index i on customers (id, name, whatever) where is_active is true;

Si su índice tiene muchas columnas y tiene muchos clientes inactivos, esto puede ser una gran ganancia en términos de espacio (el índice se almacenará en menos páginas de disco) y, por lo tanto, el rendimiento. Para llegar al índice, debe, como mínimo, especificar el predicado:

select name from customers where is_active is true;

La sabiduría convencional sugiere que la elección del índice debe basarse en la cardinalidad. Ellos dirán,

  

Para una columna de baja cardinalidad como GENDER, use bitmap. Para una alta cardinalidad como LAST_NAME, use b-tree.

Este no es el caso de Oracle , donde la elección del índice debe basarse en el tipo de aplicación (OLTP vs. OLAP). DML en tablas con índices de mapa de bits puede causar una seria contención de bloqueo. Por otro lado, Oracle CBO puede combinar fácilmente múltiples índices de mapa de bits juntos, y los índices de mapa de bits se pueden usar para buscar valores nulos. Como regla general:

  

Para un sistema OLTP con consultas frecuentes de DML y rutinas, use btree. Para un sistema OLAP con DML poco frecuentes y consultas adhoc, use bitmap.

No estoy seguro de si esto se aplica a otras bases de datos, los comentarios son bienvenidos. Los siguientes artículos discuten el tema más a fondo:

Los diferentes sistemas de bases de datos tienen nombres diferentes para el mismo tipo de índice, así que tenga cuidado con esto. Por ejemplo, qué SQL Server y Sybase llaman " índice agrupado " se llama en Oracle una " tabla organizada por índice " ;.

Le sugiero que busque en los blogs de Jason Massie ( http://statisticsio.com/ ) y Brent Ozar ( http://www.brentozar.com/ ) para obtener información relacionada. Tienen una publicación sobre el escenario de la vida real que trata con los índices.

Oracle tiene varias combinaciones de b-tree, bitmap, particiones y no particionadas, byte inverso, unión de bitmap e índices de dominio.

Aquí hay un enlace a la documentación 11gR1 sobre el tema: http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

  1. Único
  2. grupo
  3. no clúster
  4. almacén de columnas
  5. Índice con columna incluida
  6. el índice se calcula columna
  7. filtrado
  8. espacial
  9. xml
  10. texto completo

SQL Server 2008 tiene índices filtrados , similar a índices parciales de PostgreSQL. Ambos permiten incluir en el índice solo filas que coincidan con los criterios especificados.

La sintaxis es idéntica a PostgreSQL:

create index i on Customers(name) where is_alive = cast(1 as bit);

Para ver los tipos de índices y sus visitas de significado: https://msdn.microsoft.com/en-us/library/ms175049.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top