私の背景:私はDBAではなく、開発者/アーキテクトです。ごめんなさい!
したがって、約400テーブルの75GBデータベースがあります。私はプロファイラーを最大24時間実行し( "Tuning"テンプレートからLoginName
を差し引いたもの)、トレースファイルに最大7GBの使用量を記録しました。次に、このトレースファイルに対してデータベースエンジンチューニングアドバイザーを実行し(パーティション分割なし、クラスター化インデックスを保持、PDS推奨:インデックス)、運用データベース(数時間後)に対して実行しました。分析するまでに4時間を与えました。そして、ここに私が得た要約結果があります:
ここで私に際立って「間違っている」と思われるものは次のとおりです。
これはあなたたちに正しい音ですか?私はそれが私のインデックスのほとんどを落とすことを期待していましたが、それから大量の新しいインデックスを作成すると予想していました。また、9kのクエリを分析するのに4時間かかる場合、これを通常の1日の使用量と見なすこともできますか?ほとんどの大規模データベースと比較すると、私たちのデータベースは消費量がかなり少ないです(〜50ユーザー合計)。
私は何かを誤解しているのか、単に何か間違っているのだと思います。
私はDTAを気にしません。せいぜい大ざっぱな結果を出すのは大変な作業です。インデックスの調整に取り組むすべての人は、それが科学と芸術の両方であることを最終的に認識します。ツールを使用して推奨事項を取得できますが、これらの推奨事項を盲目的に実装すると、ほとんど常に問題が発生します。
代わりに、 BlitzIndex を試してみます。これは、SQL Serverが既に保持している統計を利用して、インデックス作成を改善できる場所を決定します(数秒以内にそうします)。また、結果の使用方法に関する非常にアクセスしやすいドキュメントも提供します。すべての結果には、関連するドキュメントへのリンクが含まれています。これが最近の私のインデックスの維持方法です。
@JMarxが提案したBlitzIndexツールはうまく機能しています!ただし、いくつかの良い提案を行うために、この追加のスクリプトも見つけています。必ずしもすべてまたはほとんどの提案を使用する必要はありませんが、上からチェリーピックすることは非常に便利です!
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
( ソース )
私が発見したもう1つの情報は、いくつかのイベントが発生した後は、BlitzIndexとこのスクリプトの両方が役に立たないということです。
SQL Server 2008 R2以前を実行している場合、次のいずれか新しい方であるため、これはインデックスの使用です
- インデックスが作成されたとき
- SQL Serverが最後に起動したとき
SQL Server 2012を実行している場合、以下のいずれかであるため、これはインデックスの使用です。
- インデックスが作成されたとき
- SQL Serverが最後に起動したとき
- インデックスが再構築されたとき(特に、rebuildコマンドは再編成されません)
( ソース )