我有一个非常大的数据库,其中包含数百个表,经过多次产品升级,我确信其中有一半不再使用。我如何判断一个表是否正在被主动选择?我不能只使用 Profiler——我不仅要观察几天以上,而且还有成千上万的存储过程,而且 Profiler 不会将 SP 调用转换为表访问调用。
我唯一能想到的就是在感兴趣的表上创建一个聚集索引,然后监视聚集索引上sys.dm_db_index_usage_stats
是否有任何搜索或扫描,这意味着表中的数据已加载。但是,在每个表上添加聚集索引是一个坏主意(出于多种原因),因为它实际上并不可行。
我还有其他选择吗?我一直想要一个像“SELECT 触发器”这样的功能,但可能还有其他原因导致 SQL Server 也没有这个功能。
解决方案:
谢谢,Remus,为我指明了正确的方向。使用这些列,我创建了以下 SELECT,这正是我想要的。
WITH LastActivity (ObjectID, LastAction) AS
(
SELECT object_id AS TableName,
last_user_seek as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
UNION
SELECT object_id AS TableName,
last_user_scan as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
UNION
SELECT object_id AS TableName,
last_user_lookup as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
)
SELECT OBJECT_NAME(so.object_id) AS TableName,
MAX(la.LastAction) as LastSelect
FROM sys.objects so
LEFT
JOIN LastActivity la
on so.object_id = la.ObjectID
WHERE so.type = 'U'
AND so.object_id > 100
GROUP BY OBJECT_NAME(so.object_id)
ORDER BY OBJECT_NAME(so.object_id)