データベースからのデータ抽出に、今までは問題なく動いていたけれど、急にタイムアウトのエラーがでて出力ができなくなったり、そもそもデータ取得やアップデートに時間がかかるときは、インデックスを貼ることで改善が見込めることがある。
特に前者(今まで動いていたけれど突如タイムアウトが出始めたとき)では、データがある程度溜まり、それ故、出力ができなくなるケースが多い。
そこで、システムテーブルに溜まっている統計情報をもとに、役立つ可能性があるインデックスを特定し、それらに対しインデックスを作成することで速度改善が見込まれる。
マイクロソフトが出しているこちらの記事に、おすすめインデックス抽出クエリや、抽出された結果からインデックス作成に当たり注意点などの記載があるので、参考になる。
記事で紹介されている下記クエリでは、インデックスに含めるColumn等も出力されるが、index advantageが高いほどインデックスを作成したときの効果が大きそう、Database.Schema.Tableとequility_columnsで抽出されたColumnをもとに、インデックスを作成すると効果が出る可能性がある。。。かも。
SELECT user_seeks * avg_total_user_cost * ( avg_user_impact * 0.01 ) AS [index_advantage] ,
migs.last_user_seek ,
mid.[statement] AS [Database.Schema.Table] ,
mid.equality_columns ,
mid.inequality_columns ,
mid.included_columns ,
migs.unique_compiles ,
migs.user_seeks ,
migs.avg_total_user_cost ,
migs.avg_user_impact
FROM sys.dm_db_missing_index_group_stats AS migs WITH ( NOLOCK )
INNER JOIN sys.dm_db_missing_index_groups AS mig WITH ( NOLOCK )
ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details AS mid WITH ( NOLOCK )
ON mig.index_handle = mid.index_handle
WHERE mid.database_id = DB_ID()
ORDER BY index_advantage DESC ;