web-dev-qa-db-ja.com

運用中のSQLServerデータベースの不要なインデックスを見つける方法は?

データベースのスペースを浪費することに加えて、SQL Serverの不要なインデックスは、挿入および更新操作を遅くする可能性があります。データベースの原則に精通していない開発者は、実行中のクエリにとって意味のないテーブルインデックスを作成する傾向があります。

データベースのワークロードを分析し、特定の運用データベースで使用されない、または不要なインデックスのヒントを提供するためのSQL Server 2005/2008の一般的な手順またはツールはありますか?

ありがとう!

5
splattne

ここにかわいい小さなT-SQLスクリプトが表示されています( http://blog.sqlauthority.com/2008/02/11/sql-server-2005-find-unused- indexs-of-current-database / )は、SQL Server 2005で実行する必要がある未使用のインデックスを表示します。別のインデックス http://aspadvice.com/blogs/ssmith/archive /2008/03/31/Find-Unused-SQL-2005-Indexes-for-Current-DB.aspx ここでも。

Dm_db_index_usage_statsがこれらすべての鍵であるように見えます。かなりきちんと! ( http://msdn.Microsoft.com/en-us/library/ms188755.aspx を参照してください。今作成したいくつかの本番データベースを確認する必要があります。これらの統計がどのように見えるかを確認します。(smile

編集:ここにいくつかの非常に素晴らしい追加の背景: http://blogs.msdn.com/craigfr/archive/2008/10/30/what-is-the-difference- between-sys-dm-db-index-usage-stats-and-sys-dm-db-index-operational-stats.aspx

5
Evan Anderson

Sys.dm_db_index_usage_statsの使用について留意すべきいくつかの事項:

  1. 出力には、データベースが最後に開始されてから使用されたインデックスのみが含まれます。データベースがシャットダウンされると、そのデータベースの情報のメモリ内キャッシュからすべてのエントリが削除されます。同様に、キャッシュは即時再起動後も存続しません。データベースを再起動せずに、特定のデータベースのエントリを手動でクリアする方法はありません。最初の回答(および私のブログ)で参照されているさまざまな記事では、時系列分析を行うためにさまざまな時点で出力をキャプチャする方法について説明しています。
  2. 必ず全体ビジネスサイクルをテストしてください。月末のレポートやCEOのクエリに使用されているインデックスは、魅力的かもしれませんが、削除したくありません。
  3. インデックスが有益に使用されているのか、単に費用をかけて維持されているのかを判断する前に、さまざまなカウントとその意味を理解してください。

お役に立てれば。

PSこれを読んで、SQL Server 2000に同等の方法があるかどうか疑問に思っている他の人にとって、もう1つ、いいえ、私たちは(当時チームにいたので)2005年以降の機能のみを追加しました。

5
Paul Randal

SQLServerPediaに、これを行うためのスクリプトと、その使用方法に関するチュートリアルビデオを含むwiki記事があります。

使用されていないインデックスを見つけるための1つ:

http://sqlserverpedia.com/wiki/Find_Indexes_Not_In_Use

そして、あなたが追加すべきインデックスを見つけるためのもう一つ:

http://sqlserverpedia.com/wiki/Find_Missing_Indexes

4
Brent Ozar

sys.dm_db_index_usage_statsからselect *に左結合してみてください。触れたことのないものがわかります。ただし、十分な時間が経過していることを確認してください。新しいインデックスが作成された翌日にこれを実行すると、十分な時間がない可能性があります。

また、インデックスは現在使用されていない可能性があることにも注意してください。ただし、データサイズが大きくなると、オプティマイザーはインデックスをより適切に使用できると見なします。通常、小さな(新しい)テーブルの場合、オプティマイザーは常にスキャンしますが、行数が転換点を超えたときにシークを開始します

デイブJ

編集:エヴァンは私をそれに打ち負かしました、しかし彼はその場にいます。

編集2:修正されたアドバイス、アンチジョインビットを忘れました!

2
Dave Jackson

インデックス関連のクエリを実行し、ブログでこれを示しました( http://dbalink.wordpress.com/2008/11/09/how-to-finding-index-usage-stats-with -dmv-in-tsql /

1
MarlonRibunal

SQLServerはあなたのビジネスを知らないことに注意してください。あなたの会社がどのようなビジネスの戦術的および戦略的決定を下し、行っており、これから行うかはわかりません。

これは、今日欠落しているインデックスが明日は関連性がないか、より関連性が高くなる可能性があることを意味します。同じロジックが、十分に活用されていない、またはまったく使用されていないインデックスにも当てはまります。

SQL ServerがRTMを実行したとき、私はDMテーブルで、それらのアクティビティを自動化することを考えて、熟読およびレポートするための独自のスクリプトを作成しました。SQLServerが要求していた不足しているインデックスレポートを一目見ます。 非常に動的なコンテンツのテーブルのインデックスに「含める」列として追加されるテーブルの残りのすべての列は、プロセスを自動化しないために必要な抑止力でした。

私は今でもスクリプトを使用していますが、会社のビジネス上の決定を自分の仕事に適用しています。小さな会社でできることです。

いつものように、あなたのデータを知り、あなたのビジネスを知り、あなたのビジネスの方向性を知ってください。

0
Robert Miller