dm_db_missing_index_group_stats
、dm_db_missing_index_groups
、dm_db_missing_index_details
などの欠落しているインデックスDMVをクリアするにはどうすればよいですか?
サーバーを再起動するか、最初にサーバーをオフラインにしてから再びオンラインにするオプションはありません。サーバーは本番環境であるためです。
いいえ、missing_index
DMVのみをクリアするためのノブはありません。サービスを再起動する必要があります。または、特定のテーブルを除外する場合は、フィルターを使用してDMVに対するビューを作成できます。
DBCC SQLPERF
を使用して手動でクリアできるDMVは、 sys.dm_os_wait_stats
と sys.dm_os_latch_stats
のみです。
DBCC SQLPERF ( [ LOGSPACE ] | [ "sys.dm_os_latch_stats" , CLEAR ] | [ "sys.dm_os_wait_stats" , CLEAR ] ) [WITH NO_INFOMSGS ]
一度にこれらの1つのテーブルのみをクリアできます(またはサーバーを再起動することにより)。インデックスを再構築する場合は、インデックスを追加するか、テーブルがビューから削除されるインデックスを削除します。
したがって、主キーに1行のフィルター処理されたインデックスを作成し、そのインデックスを再度ドロップすると、そのテーブルが削除されます。 DMVは最大500レコードを保持するため、最大500の1行インデックスを作成して削除する必要があります。
これは悪くないかもしれませんが、非常に頻繁に使用されるシステムで実行している場合は、テーブルでschema_mod
ロックを取得します。 1つはインデックスを作成し、もう1つはインデックスを削除します。これにより、ブロッキングが発生する可能性があります。ただし、1秒あたり数百から数千回アクセスされるテーブルを参照しています。そのようなアクセス率が表示されない場合、またはすべてのテーブルのインデックス再構築ウィンドウがある場合は、その時点で変更を加えても問題ありません。
したがって、"test"
スキーマに"dbo"
という名前のテーブルがあり、"id"
に主キーがある場合、以下のようにすると、1つのテーブルがクリアされます。-
create nonclustered index ix_dmv_drop
on dbo.test( id )
where id = 1
with( online = on );
go
drop index ix_dmv_drop on dbo.test;
go
このテンプレートから簡単なスクリプトを作成して、それらをすべて削除できます。 DMVから詳細を引き出して、作成および削除コマンドを作成するだけです。これをdm_db_index_operational_stats
のようなものにリンクすると、おおまかなアクセスレートが得られるため、ブロックの問題を回避できます。