index - indices en sql server
¿Cuáles son los diferentes tipos de índices, cuáles son los beneficios de cada uno? (11)
- Único
- racimo
- no agrupado
- tienda de columnas
- Índice con columna incluida
- índice en la columna calculada
- filtrado
- espacial
- xml
- texto completo
¿Cuáles son los diferentes tipos de índices, cuáles son los beneficios de cada uno?
Escuché sobre los índices de cobertura y agrupados, ¿hay más? ¿Dónde los usarías?
Agregaré 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
PARTICIONADO: permite dividir el índice en función de una propiedad generalmente ventajosa en objetos de base de datos muy grandes por motivos de almacenamiento o rendimiento.
Índices FUNCTION / EXPRESSION: se usan para precalcular algún valor basado en la tabla y almacenarlo en el índice, un ejemplo muy simple podría ser un índice basado en la función lower () o substring.
La sabiduría convencional sugiere que la elección del índice debe basarse en la cardinalidad. Ellos dirán,
Para una columna de cardinalidad baja como GENDER, use mapa de bits. Para una cardinalidad alta como LAST_NAME, usa b-tree.
Este no es el caso con Oracle , donde la elección del índice debería basarse en el tipo de aplicación (OLTP vs. OLAP). DML en las tablas con índices de mapa de bits puede causar una contención de bloqueo grave. Por otro lado, Oracle CBO puede combinar fácilmente múltiples índices de mapas de bits, y los índices de mapas de bits se pueden utilizar para buscar valores nulos. Como regla general:
Para un sistema OLTP con frecuentes consultas DML y de rutina, use btree. Para un sistema OLAP con consultas DML y adhoc infrecuentes, utilice mapa de bits.
No estoy seguro si esto se aplica a otras bases de datos, los comentarios son bienvenidos. Los siguientes artículos discuten el tema más a fondo:
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 alguna publicación sobre el escenario de la vida real que trata con índices.
Los diferentes sistemas de bases de datos tienen diferentes nombres para el mismo tipo de índice, así que tenga cuidado con esto. Por ejemplo, lo que SQL Server y Sybase llaman "índice agrupado" se llama en Oracle una "tabla organizada por índice".
Oracle tiene varias combinaciones de b-tree, bitmap, particionado y no particionado, byte inverso, unión de mapa de bits 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
Para ver los tipos de índices y sus visitas de significado: https://msdn.microsoft.com/en-us/library/ms175049.aspx
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 ser algo así como:
create index i on customers (id, name, whatever) where is_active is true;
Si indexas muchas columnas y tienes 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, de rendimiento. Para llegar al índice, debe, como mínimo, especificar el predicado:
select name from customers where is_active is true;
SQL Server 2008 tiene índices filtrados , similares a los índices parciales de PostgreSQL. Ambos permiten incluir en el índice únicamente las filas que coinciden con los criterios especificados.
La sintaxis es idéntica a PostgreSQL:
create index i on Customers(name) where is_alive = cast(1 as bit);
OdeToCode tiene un buen artículo que cubre las diferencias básicas
Como dice en el artículo:
Los índices adecuados son cruciales para un buen rendimiento en bases de datos grandes. A veces puede compensar una consulta mal escrita con un buen índice, pero puede ser difícil compensar la mala indexación incluso con las mejores consultas.
También es cierto ... Si recién comienzas con él, me centraré en los índices agrupados y compuestos, ya que probablemente serán los que más uses.
- Único: garantiza valores únicos para la columna (o conjunto de columnas) incluida en el índice
- Cobertura: incluye todas las columnas que se usan 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.
- En clúster: esta es la forma en que los datos reales se ordenan en el disco, lo que significa que si una consulta usa el índice agrupado para buscar los valores, no tiene que dar el paso adicional de buscar la fila de la tabla real para ningún dato no incluido en el índice.