Come faccio a far funzionare Sp_BlitzIndex di Brent Ozar su Azure?


13

Ho scaricato il kit di pronto soccorso di SQL Server dal sito Web di Brent Ozar. Quando ho provato a eseguire lo script sp_BlitzIndex sul mio database principale tramite Microsoft Sql Server Management Studio mentre ho effettuato l'accesso come amministratore a livello di server del database di Azure e ho ricevuto il seguente errore:

Messaggio 262, livello 14, stato 18, procedura sp_BlitzIndex, riga 18 autorizzazione CREATE PROCEDURE negata nel database "master".

Ho creato correttamente la procedura sull'istanza del database che volevo testare. Quando ho eseguito la procedura ho ricevuto un errore indicando:

Messaggio 50000, livello 16, stato 1, riga 1265 Nome oggetto non valido "mydatabase.sys.partitions".

Successivamente ho cercato di essere intelligente ed eseguire il codice della procedura memorizzata direttamente sul database master senza creare la procedura memorizzata e ho ottenuto il seguente errore:

Messaggio 50000, livello 15, stato 1, riga 1267 Il riferimento al nome del database e / o del server in "mydatabase.sys.indexes" non è supportato in questa versione di SQL Server.

Non mi sento abbastanza sicuro di iniziare a giocare con i meccanismi interni di ~ 2700 linee di logica euristica dell'indice. Esiste un modo rapido e semplice per far funzionare bene questa procedura memorizzata nel database SQL di Azure o dovrei cercare altrove uno strumento di analisi dell'indice / procedura memorizzata?

Risposte:


24

Kendra qui (l'autore di sp_BlitzIndex)

Innanzitutto, grazie per essere interessato alla procedura e provarla.

Azure non espone tutte le viste di gestione dinamica che otteniamo nel prodotto in scatola. In realtà faccio riferimento sys.dm_db_partition_stats, ma ci sono altre informazioni che devo ottenere da sys.partitionsaltri utenti. (Sta usando la compressione? Di che tipo?)

Non ho avuto il tempo di scrivere un test su una versione specifica di Azure, solo perché non ne ho avuto molta richiesta. Ma la tua domanda mi dice che c'è più interesse di quanto sapessi - quindi c'è quello!

Esaminerò come minimo l'implementazione della gestione degli errori in modo che ti faccia sapere in modo grazioso. (Questo è un po 'un obiettivo mobile, perché Azure ha ampliato le funzionalità disponibili anche per gli utenti.)


1
Dalla V12 espone molti altri DMV, pensi che sarai in grado di sp_BlitzIndexlavorare su V12 o ti mancano ancora troppi bit rilevanti per essere utili? A condizione che tu abbia tempo libero / domanda ovviamente. :)
Erik,

@Kendra - Sarebbe davvero fantastico se questo potesse essere aggiornato per funzionare su Azure !! Ho notato che l'ultima versione 20160715 non si verifica quando corro sp_BlitzIndexma sospettosamente dice che non ci sono problemi importanti. Sospetto che ciò sia dovuto al fatto che le informazioni richieste non sono ancora disponibili in Azure. Quando corro con @mode=4ottengo un errore.
Rory,

Sto lavorando ad altri progetti in questo momento, ed è passato così tanto tempo da quando ho lavorato su sp_BlitzIndex che non so se riconoscerei il codice. Ma una buona notizia, è open source ora! Anche altre persone possono farlo. È possibile piantare in presso firstresponderkit.org
Kendra

1

Alcune delle query "standard" per identificare gli indici mancanti vengono eseguite su Azure, ad esempio :

  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

Probabilmente saranno molto meno utili di sp_BlitzIndexma meritano una prova.

Ecco un'altra utile query per identificare le query principali, che è quindi possibile eseguire con Piano di esecuzione per identificare gli indici mancanti tramite SQL Management Studio. Tedioso facendoli uno per uno ma meglio di niente:

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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.