Revisar sugerencias de índices faltantes

Una consulta realiza muchas lecturas o presenta un acceso costoso y el plan sugiere un índice. Queremos reunir las sugerencias registradas para la base actual y ordenarlas por su beneficio acumulado estimado.

Qué necesitamos distinguir

Una sugerencia de índice es evidencia generada durante la optimización, no una instrucción de diseño. El beneficio estimado combina costo, impacto y frecuencia observados, pero no mide por completo el costo futuro de mantener ese índice.

Estas filas describen oportunidades detectadas durante la optimización. No evalúan por completo índices existentes parecidos, costo de escritura, almacenamiento, mantenimiento ni todas las consultas que usan la tabla. La consulta solo presenta evidencia; no genera ni crea índices.

Consulta

/*
    Antes de ejecutar:
        Revisa los permisos y los límites antes de ejecutar la consulta.
        Confirma el alcance, la base activa y el costo posible de la consulta.
        Captura evidencia en varios momentos antes de atribuir una causa.

    Este script es de observación. No aplica correcciones ni modifica datos.
*/

SET NOCOUNT ON;
GO
-- Consulta
DECLARE @Cantidad INT = 25;

SELECT TOP (@Cantidad)
    osi.sqlserver_start_time AS InicioInstancia,
    DB_NAME(mid.database_id) AS BaseDatos,
    OBJECT_SCHEMA_NAME(mid.object_id, mid.database_id) AS Esquema,
    OBJECT_NAME(mid.object_id, mid.database_id) AS Tabla,
    mid.equality_columns AS ColumnasIgualdad,
    mid.inequality_columns AS ColumnasDesigualdad,
    mid.included_columns AS ColumnasIncluidas,
    migs.user_seeks AS BusquedasEstimadas,
    migs.user_scans AS EscaneosEstimados,
    migs.avg_total_user_cost AS CostoPromedio,
    migs.avg_user_impact AS ImpactoPromedioPorcentaje,
    CONVERT
    (
        DECIMAL(28, 2),
        (migs.user_seeks + migs.user_scans)
        * migs.avg_total_user_cost
        * migs.avg_user_impact / 100.0
    ) AS BeneficioAcumuladoEstimado,
    migs.last_user_seek AS UltimaBusqueda,
    migs.last_user_scan AS UltimoEscaneo
FROM sys.dm_db_missing_index_group_stats AS migs
INNER JOIN sys.dm_db_missing_index_groups AS mig
    ON mig.index_group_handle = migs.group_handle
INNER JOIN sys.dm_db_missing_index_details AS mid
    ON mid.index_handle = mig.index_handle
CROSS JOIN sys.dm_os_sys_info AS osi
WHERE mid.database_id = DB_ID()
ORDER BY
    BeneficioAcumuladoEstimado DESC,
    migs.user_seeks DESC;
GO

Parámetros o permisos

Ejecuta la consulta en la base que quieres revisar. @Cantidad limita la lista. Se necesita VIEW SERVER STATE, o VIEW SERVER PERFORMANCE STATE desde SQL Server 2022. Las vistas de administración dinámica (DMV) exponen observaciones acumuladas que no persisten tras reiniciar el motor; las de índices faltantes conservan hasta 600 filas. InicioInstancia aporta contexto temporal, pero las sugerencias también pueden cambiar cuando se modifican objetos o se optimizan nuevas consultas.

Cómo leer el resultado

ColumnasIgualdad, ColumnasDesigualdad y ColumnasIncluidas describen la forma que el optimizador consideró útil. El beneficio combina frecuencia, costo estimado e impacto porcentual; sirve para ordenar, no para calcular ahorro real. Agrupa sugerencias semejantes de una misma tabla y compáralas con sus índices actuales. Si se diseña un candidato, las columnas de igualdad suelen preceder a las de desigualdad, pero el orden interno debe considerar selectividad y consultas reales.

Qué conclusión sí permite obtener

Permite priorizar sugerencias observadas para la base actual, conocer qué columnas participaron y estimar cuáles merecen una evaluación manual más profunda.

Qué conclusión todavía no permite obtener

No autoriza a crear todos los índices sugeridos ni predice su beneficio real. No incorpora completamente el costo de escrituras, espacio, mantenimiento, redundancia o impacto sobre otras consultas.

Siguiente comprobación razonable

Revisa los índices existentes y su uso. Comprueba que el candidato atienda una consulta importante, prueba su efecto en un entorno controlado y documenta también el costo de mantenerlo.

Índice del recorrido

Diagnóstico y optimización

23 artículos de Diagnóstico y optimización
  1. 01Ver solicitudes activas y su consulta SQL
  2. 02Identificar sesiones bloqueadoras y bloqueadas
  3. 03Construir la cadena de bloqueo
  4. 04Encontrar transacciones abiertas por mucho tiempo
  5. 05Encontrar sesiones inactivas con transacción abierta
  6. 06Ver esperas de las solicitudes activas
  7. 07Revisar las principales esperas acumuladas
  8. 08Encontrar consultas con mayor consumo total de CPU
  9. 09Encontrar consultas con mayor lectura lógica
  10. 10Encontrar consultas con mayor duración promedio
  11. 11Recuperar el plan de ejecución almacenado
  12. 12Revisar sugerencias de índices faltantes
  13. 13Revisar uso de índices
  14. 14Revisar fragmentación de índices con alcance controlado
  15. 15Revisar antigüedad y modificación de estadísticas
  16. 16Medir el uso de espacio y log de cada base
  17. 17Diagnosticar por qué el log no puede reutilizarse
  18. 18Recuperar deadlocks recientes de system_health
  19. 19Encontrar consultas degradadas mediante Query Store
  20. 20Encontrar sesiones y solicitudes que consumen tempdb
  21. 21Revisar concesiones de memoria pendientes o excesivas
  22. 22Calcular latencia de lectura y escritura por archivo
  23. 23Encontrar consultas con varios planes y rendimientos diferentes