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生成脚本以使其更易于使用。
即使此答案已被接受,请参阅下面的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)
| 归档时间: |
|
| 查看次数: |
16969 次 |
| 最近记录: |