17

オブジェクトが他の何かによって参照されているかどうかを調べるのは簡単な作業です。私がやりたいのは、それが実際に使用されているかどうかを特定することです。

私の解決策は、当初、データベース内のオブジェクトのリストを保持するテーブルと時間単位のジョブの組み合わせでした。

仕事は2つのことをしました。まず、前回の実行以降にデータベースに追加された新しいオブジェクトを探しました。次に、SQL のオブジェクト キャッシュを調べました。テーブル内のオブジェクトがキャッシュにリストされていた場合、そのオブジェクトは最近使用されたものとしてテーブル内でマークされていました。

6 か月が経過した時点で、テーブルの内容が調べられました。監視を開始してから参照されていない表に記載されているものは、おそらく安全にバックアップおよび削除できます。

確かに、たとえば年に 1 回など、オブジェクトが使用される可能性はありますが、ほとんどの場合は機能しているように見えました。

でも、一緒に仕事をするのはちょっと苦痛でした。

私が扱っているデータベースは 6 つほどありますが、その大部分には大量のレガシー テーブルがあり、元の作成者が他の会社に移った後もずっと残っています。

私が探しているのは、オブジェクト (テーブル、ビュー、ストアド プロシージャ、または関数) がいつ呼び出されるかを追跡する、かなり信頼できる方法です。

現在、この種のものを監視している方は、どの方法/コードを使用していますか?また、それをお勧めしますか?

4

1 に答える 1

24

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 の再起動時にリセットされることに注意してください。

于 2008-11-15T12:17:46.433 に答える