Jak uzyskać sp_BlitzIndex Brenta Ozara do uruchomienia na platformie Azure?

13

Pobrałem zestaw pierwszej pomocy programu SQL Server ze strony internetowej Brenta Ozara. Gdy próbowałem uruchomić skrypt sp_BlitzIndex przeciwko mojej głównej bazie danych za pośrednictwem Microsoft Sql Server Management Studio, gdy jestem zalogowany jako administrator poziomu serwera bazy danych Azure i otrzymałem następujący błąd:

Msg 262, poziom 14, stan 18, procedura sp_BlitzIndex, wiersz 18 Odmowa zezwolenia na utworzenie procedury w bazie danych „master”.

Z powodzeniem utworzyłem procedurę w instancji bazy danych, którą chciałem przetestować. Kiedy wykonałem procedurę, dostałem błąd informujący:

Msg 50000, poziom 16, stan 1, wiersz 1265 Niepoprawna nazwa obiektu „mydatabase.sys.partitions”.

Następnie próbowałem być sprytny i uruchomić kod procedury składowanej bezpośrednio na głównej bazie danych bez tworzenia procedury składowanej i otrzymałem następujący błąd:

Msg 50000, poziom 15, stan 1, wiersz 1267 Odwołanie do bazy danych i / lub nazwy serwera w „mydatabase.sys.indexes” nie jest obsługiwane w tej wersji programu SQL Server.

Nie czuję się wystarczająco pewny siebie, aby zacząć bawić się wewnętrznymi funkcjami ~ 2700 linii heurystycznej logiki indeksu. Czy istnieje szybki i łatwy sposób, aby ta procedura przechowywana ładnie działała w bazie danych Azure SQL Database, czy powinienem szukać gdzie indziej narzędzia do analizy indeksów / procedury przechowywanej?

Erik
źródło

Odpowiedzi:

24

Kendra tutaj (autor sp_BlitzIndex)

Po pierwsze, dziękuję za zainteresowanie tą procedurą i jej wypróbowanie.

Azure nie udostępnia wszystkich widoków dynamicznego zarządzania, które otrzymujemy w pudełkowym produkcie. Właściwie to mam odniesienie sys.dm_db_partition_stats, ale muszę uzyskać inne informacje sys.partitionsdla innych użytkowników. (Czy używa kompresji? Jaki typ?)

Nie miałem czasu napisać testu wersji specyficznej dla platformy Azure, tylko dlatego, że nie miałem na nią dużego popytu. Ale twoje pytanie mówi mi, że jest większe zainteresowanie, niż wiedziałem - więc jest!

Przynajmniej przyjrzę się implementacji obsługi błędów, więc pozwoli ci to wiedzieć z wdziękiem. (Jest to trochę ruchomy cel, ponieważ platforma Azure rozszerza funkcje dostępne również dla użytkowników).

Kendra
źródło
1
Ponieważ V12 ujawnia znacznie więcej DMV, czy myślisz, że będziesz w stanie podjąć sp_BlitzIndexpracę nad V12, czy też nadal brakuje zbyt wielu istotnych bitów, aby było warto? Oczywiście pod warunkiem, że masz wolny czas. :)
Erik,
@Kendra - Byłoby naprawdę świetnie, gdyby można to było zaktualizować do pracy na platformie Azure !! Zauważyłem, że najnowsza wersja 20160715 nie wyświetla błędu podczas uruchamiania, sp_BlitzIndexale podejrzanie mówi, że nie znaleziono żadnych poważniejszych problemów. Podejrzewam, że dzieje się tak, ponieważ wymagane informacje nie są jeszcze dostępne na platformie Azure. Kiedy biegam z @mode=4, pojawia się błąd.
Rory
Pracuję teraz nad innymi projektami i minęło tak dużo czasu, odkąd pracowałem nad sp_BlitzIndex, że nie wiem, czy w ogóle rozpoznam kod. Ale dobra wiadomość, teraz jest open source! Inni też mogą to zrobić. Możesz wrzucić
kendra
1

Niektóre „standardowe” zapytania do identyfikacji brakujących indeksów są uruchamiane na platformie Azure, na przykład :

  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

Prawdopodobnie będą znacznie mniej przydatne niż sp_BlitzIndexwarte wypróbowania.

Oto kolejne przydatne zapytanie w celu zidentyfikowania najważniejszych zapytań, które można następnie uruchomić z Planem wykonania w celu zidentyfikowania brakujących indeksów za pomocą SQL Management Studio. Żmudne robienie ich jeden po drugim, ale lepsze niż nic:

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
źródło