Comment faire fonctionner sp_BlitzIndex de Brent Ozar sur Azure?

13

J'ai téléchargé le kit de premiers soins SQL Server sur le site Web de Brent Ozar. Lorsque j'ai essayé d'exécuter le script sp_BlitzIndex sur ma base de données principale via Microsoft Sql Server Management Studio lorsque j'étais connecté en tant qu'administrateur de niveau serveur de base de données Azure et j'ai eu l'erreur suivante:

Msg 262, niveau 14, état 18, procédure sp_BlitzIndex, ligne 18 autorisation CREATE PROCEDURE refusée dans la base de données «maître».

J'ai réussi à créer la procédure sur l'instance de base de données que je voulais tester. Lorsque j'ai exécuté la procédure, j'ai eu une erreur indiquant:

Msg 50000, niveau 16, état 1, ligne 1265 Nom d'objet non valide «mydatabase.sys.partitions».

Ensuite, j'ai essayé d'être intelligent et d'exécuter le code de procédure stockée directement sur la base de données principale sans créer la procédure stockée et j'ai obtenu l'erreur suivante:

Msg 50000, niveau 15, état 1, ligne 1267 La référence au nom de la base de données et / ou du serveur dans «mydatabase.sys.indexes» n'est pas prise en charge dans cette version de SQL Server.

Je ne me sens pas assez confiant pour commencer à jouer avec le fonctionnement interne de ~ 2700 lignes de logique heuristique d'index. Existe-t-il un moyen rapide et facile de faire fonctionner correctement cette procédure stockée sur Azure SQL Database ou dois-je chercher ailleurs un outil d'analyse d'index / une procédure stockée?

Erik
la source

Réponses:

24

Kendra ici (l'auteur de sp_BlitzIndex)

Tout d'abord, merci d'être intéressé par la procédure et de l'avoir essayée.

Azure n'expose pas toutes les vues de gestion dynamique que nous obtenons dans le produit en boîte. En fait sys.dm_db_partition_stats, je fais référence , mais il y a d'autres informations dont j'ai besoin sys.partitionspour les autres utilisateurs. (Utilise-t-il la compression? Quel type?)

Je n'ai pas eu le temps d'écrire un test sur une version spécifique à Azure, simplement parce que je n'ai pas eu beaucoup de demandes pour cela. Mais votre question me dit qu'il y a plus d'intérêt que je ne le pensais - alors voilà!

Je vais au moins regarder l'implémentation d'une gestion des erreurs afin qu'elle vous permette de le savoir de manière élégante. (Il s'agit d'un peu d'une cible mobile, car Azure a également étendu les fonctionnalités disponibles aux utilisateurs.)

kendra
la source
1
Puisque V12 expose beaucoup plus de DMV pensez-vous que vous serez en mesure de sp_BlitzIndextravailler sur V12, ou manque-t-il encore trop de bits pertinents pour en valoir la peine? À condition que vous ayez du temps libre / demande bien sûr. :)
Erik
@Kendra - Ce serait vraiment génial si cela pouvait être mis à jour pour fonctionner sur Azure !! Je remarque que la dernière version 20160715 ne comporte pas d'erreur lors de mon exécution sp_BlitzIndexmais, de manière suspecte, elle indique qu'aucun problème majeur n'a été trouvé. Je pense que c'est parce que les informations requises ne sont pas encore disponibles dans Azure. Lorsque je cours avec, @mode=4j'obtiens une erreur.
Rory
Je travaille sur d'autres projets en ce moment, et cela fait si longtemps que je n'ai pas travaillé sur sp_BlitzIndex que je ne sais pas si je reconnaîtrais même le code. Mais bonne nouvelle, c'est open source maintenant! D'autres personnes peuvent le faire aussi. Vous pouvez participer sur firstresponderkit.org
kendra
1

Certaines des requêtes «standard» pour identifier les index manquants s'exécutent sur Azure, par exemple :

  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

Ils seront probablement beaucoup moins utiles que, sp_BlitzIndexmais valent la peine d'être essayés.

Voici une autre requête pratique pour identifier les principales requêtes, que vous pouvez ensuite exécuter avec Execution Plan pour identifier les index manquants via SQL Management Studio. C'est fastidieux de les faire un par un mais mieux que rien:

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
la source