SQL Server 如何检测未使用的视图和/或获取使用情况统计信息

Pat*_*ada 8 sql-server sql-server-2000 sql-server-2012

有没有办法确定一个视图是否不再被使用(不删除它们)?

理想情况下,我想知道SQL Server 2000 和 2012的视图用法。

我正在升级一些数据库并怀疑许多视图不再被使用。此外,一些视图将难以在新服务器上编译,因为它们访问多个数据库,其中一些未移动到新服务器。

Jon*_*ias 15

不幸的是,如果您想要 100% 准确,计划缓存不会削减它,因为在 SQL Server 中有所有类型的方案可能根本不会缓存计划。例如,OPTION(RECOMPILE)、零成本计划、优化临时工作负载和一次性计划存根等。

既然你想有一个方法横跨2000-2012作品,你的唯一真正的选择,保证你赶上用途是使用服务器端跟踪Audit Database Object Access事件:

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

您将需要过滤,ObjectType = 8278以便您只捕获正在访问的视图

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

然后设置一个作业,每几个小时(甚至几天,取决于数据生成率)提取文件数据并汇总计数,您将能够准确地跟踪正在发生的访问。

是的,我和下一个人一样讨厌 Trace,但这是其中一个场景,它是手头任务的正确工具。

FWIW,在 2012 年,您也可以使用服务器审计扩展事件来跟踪对象访问,但是一旦您为 2000 年创建了 Trace 定义,它应该可以移植到 2012 年,并且您可以使用Profiler生成脚本以使其更易于使用。


Han*_*non 8

即使此答案已被接受,请参阅下面的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;
Run Code Online (Sandbox Code Playgroud)

您可能希望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
Run Code Online (Sandbox Code Playgroud)