🧩 Introducción

¿Tus consultas SQL están lentas y no sabes por qué? Tal vez el problema no está en el código… sino en el índice. Aquí te explico qué tipo de índice usar según el tipo de consulta que estés ejecutando. ¡Optimiza sin complicarte!

🗂Tipos de índice y cuándo usarlos

1. Índice Agrupado (Clustered Index)
  • Definición: Determina el orden físico de los datos en la tabla.

  • Características:

    • Solo uno por tabla (porque los datos no se pueden ordenar físicamente de múltiples formas).

    • Las hojas del índice contienen los datos reales.

  • Cuándo usarlo:

    • En la clave primaria (PK) por defecto (a menos que haya razones para evitarlo).

    • Para consultas que usan JOIN, ORDER BY o GROUP BY en la columna indexada.

    • Cuando se accede frecuentemente a rangos de datos (ej. WHERE Fecha BETWEEN ...).

  • Ejemplo:

2. Índice No Agrupado (Non-Clustered Index)
  • Definición: Estructura separada que almacena una copia ordenada de las columnas indexadas + puntero a los datos.

  • Características:

    • Puede haber varios por tabla (hasta 999 en SQL Server).

    • Más pequeño que un clustered index (solo almacena columnas indexadas).

  • Cuándo usarlo:

    • Para consultas que filtran (WHERE) por una columna que no es la clave primaria.

    • Cuando se necesitan índices adicionales para acelerar búsquedas.

    • En columnas usadas en JOIN o condiciones WHERE frecuentes.

  • Ejemplo:

3. Índice Único (Unique Index)
  • Definición: Garantiza que no haya valores duplicados en la columna indexada.

  • Características:

    • Puede ser Clustered o Non Clustered.

    • Unicidad: Impide duplicados. Un intento de INSERT o UPDATE que cree un valor duplicado resultará en un error

  • Cuándo usarlo:

    • Para forzar integridad única (ej. DNI, email, códigos).

    • Cuando se necesita evitar duplicados en una columna que no es PK.

  • Ejemplo:

4. Índice Compuesto (Composite Index)
  • Definición: Índice formado por múltiples columnas.

  • Características:

    • Orden de Columnas: El orden es crítico. El índice es efectivo para búsquedas que incluyen todas las columnas del índice.

    • Puede ser Clustered o Non Clustered.

  • Cuándo usarlo:

    • Cuando las consultas filtran por varias columnas (ej. WHERE Apellido = 'X' AND Nombre = 'Y').

    • Para cubrir consultas frecuentes y evitar "Key Lookups".

  • Ejemplo:

5. Índice de Texto Completo (Full-Text Index)
  • Definición: Optimizado para búsquedas de texto avanzadas (LIKE '%palabra%', CONTAINS).

  • Características:

    • Búsqueda Semántica: Permite búsquedas flexibles usando palabras clave, sin necesidad de coincidencia exacta.

    • Puede ser Clustered o Non Clustered.

  • Cuándo usarlo:

    • Para búsquedas en grandes volúmenes de texto (artículos, descripciones).

    • Cuando LIKE no es eficiente.

  • Ejemplo:

6. Índice Filtrado (Filtered Index)
  • Definición: Índice que solo incluye un subconjunto de filas (basado en una condición WHERE).

  • Características:

    • Tamaño Reducido: Al indexar solo una parte de los datos, el índice es más pequeño, ocupa menos espacio en disco y en memoria.

    • Rendimiento Mejorado: Las consultas que se benefician del filtro son más rápidas, ya el motor de base de datos tiene menos entradas que recorrer y mantener.

    • Mantenimiento Más Barato: Las operaciones de INSERT, UPDATE, y DELETE en filas que no cumplen el filtro no afectan al índice.

  • Cuándo usarlo:

    • Cuando solo se consultan filas específicas (ej. WHERE Activo = 1).

    • Para reducir el tamaño del índice en tablas grandes.

  • Ejemplo:

7. Índice Columnstore (Columnstore Index)
  • Definición: Almacena datos por columnas (no por filas), optimizado para data warehousing y análisis.

  • Características:

    • Los datos de cada columna se almacenan juntos en segmentos, esto permite una muy alta compresión.

    • Modo de Procesamiento por Lotes (Batch Mode): SQL Server procesa los datos en grupos de filas a la vez (en lugar de una por una), lo que reduce drásticamente la sobrecarga de la CPU y acelera las consultas.

  • Tipos:

    • Clustered Columnstore: Reemplaza la tabla completa (ideal para tablas de hechos en un DW).

    • Non-Clustered Columnstore: Se agrega a una tabla tradicional.

  • Cuándo usarlo:

    • En consultas analíticas (SUM, AVG, GROUP BY grandes).

    • Para tablas con millones de filas y operaciones de agregación.

  • Ejemplo:

📊 Resumen: ¿Cuál Índice Usar?

Tipo de índice

Índice agrupado (Clustered)

Índice no agrupado (Nonclustered)

Índice único (Unique)

Compuesto

Full Text Index

Índice filtrado (Filtered Index)

Índice ColumnStore

¿Cuándo usarlo?

Consultas de rango o que ordenan por una columna específica

Búsquedas exactas o filtros por columnas específicas

Columnas que deben tener valores únicos (ej. correo, ID externo)

Consultas con múltiples columnas

Búsquedas de texto complejas

Consultas que filtran por valores específicos (ej. estado = ‘Activo’)

Consultas analíticas sobre grandes volúmenes de datos

Ventajas clave

Ordena físicamente los datos, ideal para búsquedas secuenciales rápidas

No altera el orden físico, permite múltiples índices por tabla

Asegura integridad y mejora el plan de ejecución

Mayor eficiencia al mantener un único índice para combinar columnas

Optimización de búsqueda de texto libre en grandes volúmenes de datos

Mejora rendimiento en subconjuntos de datos

Optimizado para lectura masiva y compresión