2010-09-15 20 views
5

Estoy retocando con la creación de una consulta para encontrar los índices que faltan. He tomado una consulta base creada por los amigos de Red-Gate en su eBook de SQL Server DMV Starter Pack y la estoy modificando un poco. Hay un par de columnas en sys.dm_db_missing_index_group_stats que no sé cómo interpretar. Ellos son:SQL Server DMV - sys.dm_db_missing_index_group_stats - ¿Qué significan estas columnas?

avg_total_user_cost 
avg_user_impact 

De acuerdo con la documentación que encontré avg_total_user_cost se define como representa el costo total medio de usuario cada vez que el usuario consulta fue ejecutado. Y, avg_user_impact Representa el valor como un porcentaje. Muestra la cantidad de mejora que puede obtener si se crea el índice.

Un índice que mi consulta dice que se debe agregar muestra un costo promedio de usuario de 2.22 y un impacto de 99.82 usuarios. ¿Qué significan realmente estos números? Significa que al agregar un índice, puedo mejorar la velocidad de la consulta asociada en un 99.82%. No tengo ni idea de qué podría significar 2.22.

Gracias.

+0

¿Tiene una buena consulta para encontrar los índices que faltan? –

+0

hay uno bueno aquí: http://www.geniiius.com/blog/missing-indexes –

Respuesta

9

Mi interpretación de éstos ha sido que:

  • avg_total_user_cost es el promedio actual de todas las consultas que podría potencialmente beneficiarse de la creación del grupo índice que falta. El "costo" es un valor sin unidades calculado por el optimizador . Ver: SQL SERVER – Execution Plan – Estimated I/O Cost – Estimated CPU Cost – No Unit

  • avg_user_impact es un porcentaje que representa la disminución promedio en el costo de todas las consultas si se creó el grupo de índice que falta. El mayor el porcentaje, el mayor será el beneficio del nuevo índice.

3

@ respuesta de Joe parece correcto, sólo estoy añadiendo algo de información posiblemente-útil:

Hay un artículo here que utiliza este cálculo para dar un valor de impacto de eficacia general:

avg_total_user_cost * avg_user_impact * (migs.user_seeks + migs.user_scans)) 

Aquí está la consulta que sugieren:

SELECT CONVERT (varchar, getdate(), 126) AS runtime, 
    mig.index_group_handle, mid.index_handle, 
    CONVERT (decimal (28,1), migs.avg_total_user_cost * migs.avg_user_impact * 
      (migs.user_seeks + migs.user_scans)) AS improvement_measure, 
    'CREATE INDEX missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + 
       CONVERT (varchar, mid.index_handle) + ' ON ' + mid.statement + ' 
       (' + ISNULL (mid.equality_columns,'') 
       + CASE WHEN mid.equality_columns IS NOT NULL 
          AND mid.inequality_columns IS NOT NULL 
        THEN ',' ELSE '' END + ISNULL (mid.inequality_columns, '') 
       + ')' 
       + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement, 
    migs.*, 
    mid.database_id, 
    mid.[object_id] 
FROM sys.dm_db_missing_index_groups AS mig 
INNER JOIN sys.dm_db_missing_index_group_stats AS migs 
    ON migs.group_handle = mig.index_group_handle 
INNER JOIN sys.dm_db_missing_index_details AS mid 
    ON mig.index_handle = mid.index_handle 
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC 

La resultante improvement_measure es uni tless, es decir, solo útil en un sentido relativo, pero esto debería ayudar a combinar los diferentes valores de dm_db_missing_index_group_stats en algo útil para tomar decisiones.

Cuestiones relacionadas