web-dev-qa-db-ja.com

SQL Serverで未使用のビューを検出したり、使用状況の統計を取得したりする方法

(削除せずに)ビューが使用されなくなったかどうかを確認する方法はありますか?

理想的にはSQL Server 2000および2012のビューの使用法を知りたいです。

一部のデータベースをアップグレードしていますが、ビューの多くが使用されていないようです。また、ビューの中には、複数のデータベースにアクセスするため、新しいサーバーでコンパイルするのが難しいものもあり、それらのいくつかは新しいサーバーに移動されていません。

7
PatFromCanada

この回答は受け入れられましたが、これを行うより良い方法については、 Jonathan Kehayias ' 回答 以下 を参照してください。


SQL Server 2012の場合、ビューの名前についてプランキャッシュを検査できます。

DECLARE     @FindSql nvarchar(max) = 'name_of_view';
SELECT 
    /* cp.*, ct.* */
    cp.objtype AS [Type],
    cp.refcounts AS ReferenceCount,
    cp.usecounts AS UseCount,
    cp.size_in_bytes / 1024 AS SizeInKB,
    db_name(ct.dbid) AS [Database],
    CAST(pt.query_plan as xml) as QueryPlan
FROM sys.dm_exec_cached_plans cp
OUTER APPLY sys.dm_exec_text_query_plan(plan_handle, 0, -1) pt
OUTER APPLY sys.dm_exec_sql_text(plan_handle) AS ct
WHERE (ct.text LIKE '%' + @FindSql + '%') OR (pt.query_plan LIKE '%' + @FindSql + '%')
ORDER BY cp.usecounts DESC;

DBCC FREEPROCCACHE <sql_plan_handle>このビューを使用するすべてのプランのプランハンドルを使用して、上記のクエリの結果を監視し、再び表示されるかどうかを確認します。

MSSQLTips には、SQL Server 2000でこれを行う方法に関する優れた記事があります+

USE Master
GO
SELECT 
    UseCounts, RefCounts,CacheObjtype, ObjType, DB_NAME(dbid) as DatabaseName, SQL
FROM syscacheobjects
WHERE SQL LIKE '%view_name_here%'
ORDER BY dbid,usecounts DESC,objtype
8
Max Vernon

残念ながら、100%正確にしたい場合、プランがまったくキャッシュされない可能性のあるSQL Serverのシナリオにはすべての種類があるため、プランキャッシュはそれを削減しません。たとえば、OPTION(RECOMPILE)、ゼロコストプラン、アドホックワークロードおよびシングルユースプランスタブなどの最適化。

2000-2012で機能するメソッドが必要なため、使用状況を確実に把握するための実際のオプションは、サーバー側のトレースAudit Database Object Accessイベント:

http://msdn.Microsoft.com/en-us/library/ms175013.aspx

アクセス中のViewsのみをキャッチするように、ObjectType = 8278でフィルタリングする必要があります。

http://msdn.Microsoft.com/en-us/library/ms180953.aspx

次に、ファイルデータをプルし、数時間ごと(またはデータ生成率によっては数日)ごとにカウントを集計するジョブをセットアップします。これにより、発生しているアクセスを正確に追跡できます。

ええ、私はTraceを次の人と同じくらい嫌いですが、これは、手元のタスクに適したツールであるシナリオの1つです。

FWIW、2012では、Server AuditまたはExtended Eventsを使用できますオブジェクトアクセスも追跡しますが、2000のトレース定義を作成すると、大部分が2012に移植可能になり、Profiler作業をより簡単にするためのスクリプトを生成します。

15