運用中の SQL Server データベースの不要なインデックスを見つける方法はありますか?

運用中の SQL Server データベースの不要なインデックスを見つける方法はありますか?

データベースのスペースを無駄にするだけでなく、SQL Server 上の不要なインデックスは挿入および更新操作を遅くする可能性があります。データベースの原則に関する経験が不足している開発者は、実行中のクエリにとって意味のないテーブル インデックスを作成しがちです。

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

ありがとう!

答え1

ここにかわいい小さなT-SQLスクリプトがあります(http://blog.sqlauthority.com/2008/02/11/sql-server-2005-find-unused-indexes-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 これらの統計がどのようなものかを確認するには、今作成した運用データベースをいくつか確認する必要があります。(笑顔

編集: ここに非常に素晴らしい追加の背景があります: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

答え2

sys.dm_db_index_usage_stats の使用に関して留意すべき点がいくつかあります。

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

お役に立てれば。

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

答え3

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

使用されていないインデックスを見つける方法:

http://sqlserverpedia.com/wiki/Find_Indexes_Not_In_Use

インデックスを見つけるために、次のものを追加する必要があります。

http://sqlserverpedia.com/wiki/Find_Missing_Indexes

答え4

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

関連情報