我使用sys.dm_db_index_usage_stats.last_user_seek
,sys.dm_db_index_usage_stats.last_user_scan
和sys.dm_db_index_usage_stats.last_user_lookup
查询上次读取表的时间。
对于我正在使用的视图、函数和存储过程,sys.objects
但它没有任何用于读取日期时间的字段。
是否有任何系统表可以让我看到上次读取/使用这些类型的对象的时间?
我的目标是找到未使用的对象并可能丢弃它们。
除非您正在运行服务器端跟踪或 XEvent 运行,否则无法保证使用或不使用特定对象。您的 CIO 或业务用户每年运行一次的报告可能会引用某些对象。因此,除非您拥有业务生命周期的具体数据,否则总会有出错的余地。
我建议,一旦您确定了可能的删除候选人,不要删除它们,而是重命名它们,并在一年左右后删除它们。
使用 DMV 时,您需要将它们记录到持久表中,因为 DMV 数据由于实例重启、某些
sp_configure
更改等而被刷新。我在这里回答了一个类似的问题,可以帮助您入门。
不幸的是,没有 100% 准确的方法来确定这一点。但是,您可以通过检查所有可能进行数据库调用的代码以及所有数据库对象和SQL Server 代理作业的定义来尽可能接近。通常有一些不经常访问的代码路径,因此很容易不会出现在 DMV、扩展事件、SQL Profiler 跟踪甚至自定义日志记录中。检查所有代码将使您尽可能接近。
详尽的代码搜索唯一遗漏的区域是不在任何地方的代码中的即席查询。在这种情况下,DMV、痕迹等至少有可能识别使用情况,但肯定不能保证。
没有内置日志记录的最佳选择是使用以下查询:
存储过程有一个专用的 DMV。
DMV 将显示自上次服务器重新启动或分离以来的执行统计信息(可能需要确认)。这意味着如果在附加或重新启动数据库后尚未运行存储过程,则此 dmv 中将没有条目。您可以将它与对象表结合起来以查找 NULL 并假设尚未运行的内容。
如果您需要触发活动,您可以使用与上面相同的查询,但
sys.dm_exec_trigger_stats
用作表。为了让 DMV 为所有数据库提供正确的结果,我们可以修改 @dfundako 共享的脚本如下: