私は数百のテーブルを含む非常に大規模なデータベースを持っており、多くの製品をアップグレードした後、それらの半分はもう使用されていないと確信しています。テーブルがアクティブに選択されているかどうかを確認するにはどうすればよいですか?プロファイラーを使用することはできません。数日以上監視したいだけでなく、何千ものストアドプロシージャもあり、プロファイラーはSP呼び出しをテーブルアクセス呼び出しに変換しません。
私が考えることができる唯一のことは、対象のテーブルにクラスター化されたインデックスを作成し、クラスター化されたインデックスにsys.dm_db_index_usage_stats
シークまたはスキャンがあるかどうかを監視することです。これは、テーブルからのデータがロードされたことを意味します。ただし、実際には実行可能ではないため、すべてのテーブルにクラスター化インデックスを追加することは(さまざまな理由で)悪い考えです。
他に選択肢はありますか?私は常に「SELECTトリガー」のような機能が必要でしたが、SQLServerにその機能がない理由はおそらく他にもあります。
解決:
レムス、私を正しい方向に向けてくれてありがとう。これらの列を使用して、次のSELECTを作成しました。これは、まさに私が望むことを実行します。
WITH LastActivity (ObjectID, LastAction) AS
(
SELECT object_id AS TableName,
last_user_seek as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
UNION
SELECT object_id AS TableName,
last_user_scan as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
UNION
SELECT object_id AS TableName,
last_user_lookup as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
)
SELECT OBJECT_NAME(so.object_id) AS TableName,
MAX(la.LastAction) as LastSelect
FROM sys.objects so
LEFT
JOIN LastActivity la
on so.object_id = la.ObjectID
WHERE so.type = 'U'
AND so.object_id > 100
GROUP BY OBJECT_NAME(so.object_id)
ORDER BY OBJECT_NAME(so.object_id)