ブレントオザーのsp_BlitzIndexをAzureで実行するにはどうすればよいですか?


13

Brent OzarのWebサイトからSQL Server First Aid Kitをダウンロードしました。Azureデータベースサーバーレベルの管理者としてログインしているときに、Microsoft Sql Server Management Studioを介してmasterデータベースに対してsp_BlitzIndexスクリプトを実行しようとすると、次のエラーが発生しました。

メッセージ262、レベル14、状態18、プロシージャsp_BlitzIndex、行18 CREATE PROCEDURE権限がデータベース 'master'で拒否されました。

テストするデータベースインスタンスでプロシージャを正常に作成しました。プロシージャを実行すると、次のようなエラーが表示されました。

メッセージ50000、レベル16、状態1、行1265無効なオブジェクト名「mydatabase.sys.partitions」。

次に、巧妙にしようとし、ストアドプロシージャを作成せずにmasterデータベースに対して直接ストアドプロシージャコードを実行しようとすると、次のエラーが発生しました。

Msg 50000、レベル15、状態1、行1267 'mydatabase.sys.indexes'のデータベースおよび/またはサーバー名への参照は、このバージョンのSQL Serverではサポートされていません。

〜2700行のインデックスヒューリスティックロジックの内部動作をいじり始めるのに十分な自信がありません。このストアドプロシージャをAzure SQL Databaseで適切に動作させるための迅速かつ簡単な方法はありますか、それともインデックス分析ツール/ストアドプロシージャを他の場所で探す必要がありますか?

回答:


24

ケンドラはこちら(の著者sp_BlitzIndex

まず、手順に興味を持って試してくれてありがとう。

Azureは、ボックス版製品で得られるすべての動的管理ビューを公開しません。私は実際に参照sys.dm_db_partition_statsしていますがsys.partitions、他のユーザーのために取得する必要がある他の情報があります。(圧縮を使用していますか?どのタイプですか?)

Azureの特定のバージョンのテストを作成する時間がありませんでした。なぜなら、それに対する要求があまりなかったからです。しかし、あなたの質問は、私が知っていたよりも多くの関心があることを教えてくれます-それがあります!

エラー処理を実装することを少なくとも見て、それであなたが優雅な方法で知ることができるようにします。(これは、Azureがユーザーにも利用可能な機能を拡張しているためです。)


1
V12 はより多くのDMVを公開するので、V12でsp_BlitzIndex作業できるようになると思いますか、それとも価値のある関連ビットがまだ足りないのでしょうか?もちろん、空き時間/需要がある場合。:)
エリック

@Kendra-これがAzureで動作するように更新できたら本当に素晴らしいことです!! 最新バージョン20160715を実行してもエラーにならないことに気付きましたsp_BlitzIndexが、疑わしいことに、大きな問題は見つかりませんでした。これは、必要な情報がまだAzureで利用できないためだと思われます。で実行すると@mode=4エラーが発生します。
ロリー

私は現在他のプロジェクトに取り組んでおり、sp_BlitzIndexに取り組んできてから非常に長いので、コードを認識できるかどうかもわかりません。しかし、朗報です、今はオープンソースです!他の人もできます。firstresponderkit.org
ケンドラ

1

不足しているインデックスを識別するための「標準的な」クエリのいくつかは、Azureの上で実行します例えば

  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

それらは、それほど有用ではありsp_BlitzIndexませんが、試してみる価値があります。

上位クエリを特定するための別の便利なクエリを次に示します。実行プランをオンにして実行すると、SQL Management Studioを介して不足しているインデックスを特定できます。面倒なことを1つずつ行いますが、何もしないよりはましです。

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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.