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.