¿Cómo consigo que se ejecute sp_BlitzIndex de Brent Ozar en Azure?

13

Descargué el Kit de primeros auxilios de SQL Server del sitio web de Brent Ozar. Cuando intenté ejecutar el script sp_BlitzIndex en mi base de datos maestra a través de Microsoft Sql Server Management Studio mientras estaba conectado como administrador de nivel de servidor de la base de datos de Azure, recibí el siguiente error:

Mensaje 262, Nivel 14, Estado 18, Procedimiento sp_BlitzIndex, Línea 18 Permiso de CREAR PROCEDIMIENTO denegado en la base de datos 'maestro'.

Creé con éxito el procedimiento en la instancia de la base de datos que quería probar. Cuando ejecuté el procedimiento, recibí un error que decía:

Msg 50000, Nivel 16, Estado 1, Línea 1265 Nombre de objeto no válido 'mydatabase.sys.partitions'.

Luego intenté ser inteligente y ejecutar el código del procedimiento almacenado directamente en la base de datos maestra sin crear el procedimiento almacenado y obtuve el siguiente error:

Msg 50000, Nivel 15, Estado 1, Línea 1267 La referencia a la base de datos y / o el nombre del servidor en 'mydatabase.sys.indexes' no es compatible con esta versión de SQL Server.

No me siento lo suficientemente seguro como para comenzar a jugar con el funcionamiento interno de ~ 2700 líneas de lógica heurística de índice. ¿Existe una manera rápida y fácil de hacer que este procedimiento almacenado funcione bien en Azure SQL Database o debería buscar en otra parte una herramienta de análisis de índice / procedimiento almacenado?

Erik
fuente

Respuestas:

24

Kendra aquí (el autor de sp_BlitzIndex)

Primero, gracias por estar interesado en el procedimiento y probarlo.

Azure no expone todas las vistas de administración dinámica que obtenemos en el producto en caja. Realmente hago referencia sys.dm_db_partition_stats, pero hay otra información que necesito obtener sys.partitionspara otros usuarios. (¿Está usando compresión? ¿Qué tipo?)

No he tenido tiempo de escribir una prueba de una versión específica de Azure, solo porque no he tenido mucha demanda. Pero su pregunta me dice que hay más interés del que sabía, ¡así que eso es todo!

Sin embargo, al menos veré la implementación de algunos manejos de errores para que te permita saber de una manera elegante. (Este es un objetivo móvil, porque Azure también ha expandido las funciones que están disponibles para los usuarios).

kendra
fuente
1
Dado que V12 expone muchos más DMV, ¿cree que podrá sp_BlitzIndextrabajar en V12, o todavía le faltan demasiados bits relevantes para que valga la pena? Siempre que tenga tiempo libre / demanda, por supuesto. :)
Erik
@Kendra - ¡Sería genial si esto pudiera actualizarse para que funcione en Azure! Noto que la última versión 20160715 no produce un error cuando ejecuto, sp_BlitzIndexpero sospechosamente dice que no se encontraron problemas importantes. Sospecho que esto se debe a que la información requerida aún no está disponible en Azure. Cuando corro @mode=4me sale un error.
Rory
Estoy trabajando en otros proyectos en este momento, y ha pasado tanto tiempo desde que trabajé en sp_BlitzIndex que no sé si siquiera reconocería el código. Pero buenas noticias, ¡es de código abierto ahora! Otras personas también pueden hacerlo. Puede participar en firstresponderkit.org
kendra
1

Algunas de las consultas 'estándar' para identificar índices faltantes se ejecutan en Azure, por ejemplo :

  SELECT
  migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure,
  'CREATE INDEX [missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle)
  + '_' + LEFT (PARSENAME(mid.statement, 1), 32) + ']'
  + ' 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 mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

Es probable que sean mucho menos útiles sp_BlitzIndexpero que valen la pena intentarlo.

Aquí hay otra consulta útil para identificar las principales consultas, que luego puede ejecutar con el Plan de ejecución para identificar los índices que faltan a través de SQL Management Studio. Tedioso haciéndolos uno por uno pero mejor que nada:

SELECT TOP 1000 qs.execution_count, 
       qs.total_worker_time, 
       qs.total_worker_time / qs.execution_count AS 'Avg CPU Time', 
       qs. total_physical_reads, 
       qs.total_physical_reads / qs.execution_count AS 'Avg Physical Reads', 
       qs.total_logical_reads, 
       qs.total_logical_reads / qs.execution_count AS 'Avg Logical Reads', 
       qs.total_logical_writes, 
       qs.total_logical_writes / qs.execution_count AS 'Avg Logical Writes', 
       SUBSTRING(st.text, qs.statement_start_offset / 2 + 1, 
        (CASE qs.statement_end_offset
                     WHEN-1 THEN DATALENGTH(st.text)
                     ELSE qs.statement_end_offset
                     END
           - qs.statement_start_offset) / 2 + 1)AS statement_text
  FROM sys.dm_exec_query_stats AS qs 
  CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle)AS st
  ORDER BY qs.execution_count DESC;
Rory
fuente