Microsoft SQL Server 2005で未使用のオブジェクトを識別する
-
08-07-2019 - |
質問
オブジェクトが他の何かによって参照されているかどうかを調べるのは簡単な作業です。私がやりたいことは、それが実際に使用されているかどうかを特定することです。
元々、私のソリューションには、データベース内のオブジェクトのリストを保持するテーブルと1時間ごとのジョブの組み合わせが含まれていました。
ジョブは2つのことを行いました。最初に、最後の実行以降にデータベースに追加された新しいオブジェクトを探しました。次に、SQLのオブジェクトキャッシュを調べました。テーブル内のオブジェクトがキャッシュにリストされていた場合、そのオブジェクトは最近「見られた」ものとしてテーブルでマークオフされました。使用中。
6か月の期間の終わりなどで、テーブルの内容が調べられました。表にリストされているもののうち、監視を開始してから参照されていなかったものはすべて、おそらくバックアップおよび削除しても安全です。
もちろん、1年に1回など何回でも使用されるオブジェクトの可能性はありますが、ほとんどの場合は機能するようです。
ただし、作業するのは少し苦労しました。
私が使用しているデータベースは約半ダースあり、その大部分には大量のレガシーテーブルがあり、元の作成者が他の会社に移った後も長く残っています。
探しているのは、オブジェクト(テーブル、ビュー、ストアドプロシージャ、または関数)がいつ呼び出されるかを追跡する、かなり信頼できる方法です。
この種のことを現在監視しているあなたのために、どのメソッド/コードを使用しますか?あなたはそれをお勧めしますか?
解決
SQL Server 2005では、動的管理ビューsys.dm_db_index_usage_statsを使用できます。名前には「インデックス」と書かれています。しかし、それは少し誤解を招く恐れがあります-インデックスがなくても、すべてのテーブルにエントリがあります。 SQL Magazineの便利なクエリを次に示します。
SELECT
t.name AS 'Table',
SUM(i.user_seeks + i.user_scans + i.user_lookups)
AS 'Total accesses',
SUM(i.user_seeks) AS 'Seeks',
SUM(i.user_scans) AS 'Scans',
SUM(i.user_lookups) AS 'Lookups'
FROM
sys.dm_db_index_usage_stats i RIGHT OUTER JOIN
sys.tables t ON (t.object_id = i.object_id)
GROUP BY
i.object_id,
t.name
ORDER BY [Total accesses] DESC
元の記事は次のとおりです。
http://www.sqlmag.com/Article/ArticleID/53878/ sql_server_53878.html
これらの使用統計は、SQL Serverの再起動時にリセットされることに注意してください。