Wie kann ich den sp_BlitzIndex von Brent Ozar auf Azure ausführen?

13

Ich habe das Erste-Hilfe-Kit für SQL Server von der Brent Ozar-Website heruntergeladen. Beim Versuch, das Skript sp_BlitzIndex über Microsoft SQL Server Management Studio für meine master-Datenbank auszuführen, während ich als Administrator auf Azure-Datenbankserverebene angemeldet war, wurde die folgende Fehlermeldung angezeigt:

Meldung 262, Ebene 14, Status 18, Prozedur sp_BlitzIndex, Zeile 18 Die CREATE PROCEDURE-Berechtigung wurde in der 'master'-Datenbank verweigert.

Ich habe die Prozedur erfolgreich auf der Datenbankinstanz erstellt, die ich testen wollte. Als ich die Prozedur ausführte, bekam ich eine Fehlermeldung:

Meldung 50000, Ebene 16, Status 1, Zeile 1265 Ungültiger Objektname 'mydatabase.sys.partitions'.

Als Nächstes habe ich versucht, clever zu sein und den Code für gespeicherte Prozeduren direkt für die Masterdatenbank auszuführen, ohne die gespeicherte Prozedur zu erstellen. Dabei ist der folgende Fehler aufgetreten:

Meldung 50000, Ebene 15, Status 1, Zeile 1267 Der Verweis auf den Datenbank- und / oder Servernamen in "mydatabase.sys.indexes" wird in dieser Version von SQL Server nicht unterstützt.

Ich fühle mich nicht sicher genug, um mit dem Innenleben von ~ 2700 Zeilen indexheuristischer Logik zu spielen. Gibt es eine schnelle und einfache Möglichkeit, diese gespeicherte Prozedur für eine reibungslose Funktion in der Azure SQL-Datenbank zu nutzen, oder sollte ich anderswo nach einem Indexanalysetool / einer gespeicherten Prozedur suchen?

Erik
quelle

Antworten:

24

Kendra hier (der Autor von sp_BlitzIndex)

Zunächst einmal vielen Dank, dass Sie sich für das Verfahren interessieren und es ausprobieren.

Azure macht nicht alle dynamischen Verwaltungsansichten verfügbar, die im Produktpaket enthalten sind. Ich verweise tatsächlich sys.dm_db_partition_stats, aber es gibt andere Informationen, die ich sys.partitionsfür andere Benutzer abrufen muss. (Verwendet es Komprimierung? Welcher Typ?)

Ich hatte keine Zeit, eine Azure-spezifische Version zu testen, nur weil ich nicht viel Nachfrage danach hatte. Aber Ihre Frage sagt mir, dass es mehr Interesse gibt, als ich wusste - also gibt es das!

Ich werde mich zumindest mit der Implementierung einer Fehlerbehandlung befassen, damit Sie dies auf elegante Weise wissen. (Dies ist ein bewegliches Ziel, da Azure die Funktionen erweitert hat, die auch Benutzern zur Verfügung stehen.)

Kendra
quelle
1
Da in V12 viel mehr DMVs verfügbar sind, sind Sie der Meinung, dass Sie in der Lage sind, sp_BlitzIndexan V12 zu arbeiten, oder fehlen immer noch zu viele relevante Bits, um sich zu lohnen? Vorausgesetzt, Sie haben Freizeit / Nachfrage natürlich. :)
Erik
@ Kendra - Es wäre wirklich großartig, wenn dies auf Azure aktualisiert werden könnte !! Ich stelle fest, dass die neueste Version 20160715 beim Ausführen keinen Fehler macht, sp_BlitzIndexaber es wird verdächtigt, dass keine größeren Probleme gefunden wurden. Ich vermute, das liegt daran, dass die erforderlichen Informationen in Azure noch nicht verfügbar sind. Wenn ich mit @mode=4renne bekomme ich eine Fehlermeldung.
Rory
Ich arbeite gerade an anderen Projekten, und es ist so lange her, dass ich an sp_BlitzIndex gearbeitet habe, dass ich nicht weiß, ob ich den Code überhaupt erkennen würde. Aber gute Nachrichten, es ist jetzt Open Source! Das können auch andere. Sie können bei firstresponderkit.org
kendra
1

Einige der Standardabfragen zum Ermitteln fehlender Indizes werden in Azure ausgeführt. Beispiel :

  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

Sie sind wahrscheinlich weniger nützlich als, sp_BlitzIndexaber einen Versuch wert.

Im Folgenden finden Sie eine weitere nützliche Abfrage zum Ermitteln der wichtigsten Abfragen, die Sie mit Ausführungsplan ausführen können, um fehlende Indizes über SQL Management Studio zu ermitteln. Mühsam, eins nach dem anderen, aber besser als gar nichts:

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
quelle