Revisar sugerencias de índices faltantes

Señal o problema observado

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

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

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;

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.

La información no persiste tras reiniciar el motor y las DMV 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 que ya existen 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.