Como faço para que o sp_BlitzIndex de Brent Ozar seja executado no Azure?

13

Fiz o download do Kit de Primeiros Socorros do SQL Server no site de Brent Ozar. Quando tentei executar o script sp_BlitzIndex no meu banco de dados mestre via Microsoft Sql Server Management Studio enquanto estava logado como administrador no nível do servidor de banco de dados do Azure, obtive o seguinte erro:

Mensagem 262, nível 14, estado 18, procedimento sp_BlitzIndex, linha 18 permissão CREATE PROCEDURE negada no banco de dados 'mestre'.

Criei com sucesso o procedimento na instância de banco de dados que desejava testar. Quando executei o procedimento, recebi um erro informando:

Msg 50000, Nível 16, Estado 1, Linha 1265 Nome de objeto inválido 'mydatabase.sys.partitions'.

Em seguida, tentei ser inteligente e execute o código do procedimento armazenado diretamente no banco de dados mestre sem criar o procedimento armazenado e obtive o seguinte erro:

Msg 50000, Nível 15, Estado 1, Linha 1267 A referência ao banco de dados e / ou nome do servidor em 'mydatabase.sys.indexes' não é suportada nesta versão do SQL Server.

Não me sinto confiante o suficiente para começar a brincar com o funcionamento interno de ~ 2700 linhas de lógica heurística de índice. Existe uma maneira rápida e fácil de fazer com que esse procedimento armazenado funcione bem no Banco de Dados SQL do Azure ou devo procurar em outro lugar uma ferramenta de análise de índice / procedimento armazenado?

Erik
fonte

Respostas:

24

Kendra aqui (o autor de sp_BlitzIndex)

Primeiro, obrigado por estar interessado no procedimento e testá-lo.

O Azure não expõe todas as visualizações de gerenciamento dinâmico que obtemos no produto in a box. Na verdade sys.dm_db_partition_stats, faço referência , mas há outras informações que preciso obtersys.partitions para outros usuários. (Ele está usando compactação? Que tipo?)

Não tive tempo de escrever um teste em uma versão específica do Azure, apenas porque não tive muita demanda por isso. Mas sua pergunta me diz que há mais interesse do que eu sabia - então é isso!

No mínimo, analisarei a implementação de um tratamento de erros, para que você saiba de maneira graciosa. (Esse é um destino em movimento, porque o Azure também está expandindo os recursos disponíveis para os usuários.)

Kendra
fonte
1
Como a V12 expõe muito mais DMVs, você acha que poderá sp_BlitzIndextrabalhar na V12 ou ainda falta muitos bits relevantes para valer a pena? Desde que você tenha tempo livre / demanda, é claro. :)
Erik
@ Kendra - Seria ótimo se isso pudesse ser atualizado para funcionar no Azure !! Percebo que a versão mais recente 20160715 não erro quando executo, sp_BlitzIndexmas desconfio que ele diz que não há grandes problemas encontrados. Eu suspeito que isso ocorre porque as informações necessárias ainda não estão disponíveis no Azure. Quando corro @mode=4, recebo um erro.
Rory
Estou trabalhando em outros projetos agora e faz tanto tempo desde que trabalhei no sp_BlitzIndex que nem sei se eu reconheceria o código. Mas boas notícias, agora é de código aberto! Outras pessoas também podem fazer isso. Você pode entrar
kendra
1

Algumas das consultas 'padrão' para identificar índices ausentes são executadas no Azure, por exemplo :

  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

Eles provavelmente serão muito menos úteis do que, sp_BlitzIndexmas valem a pena tentar.

Aqui está outra consulta útil para identificar as principais consultas, que você pode executar com o Plano de Execução para identificar índices ausentes através do SQL Management Studio. Tedioso fazê-los um por um, mas melhor 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
fonte