gpt4 book ai didi

sql-server - 如何判断数据库表是否正在被访问?想要类似 "SELECT trigger"的东西

转载 作者:行者123 更新时间:2023-12-01 17:41:04 25 4
gpt4 key购买 nike

我有一个非常大的数据库,有数百个表,经过多次产品升级后,我确信其中一半不再被使用。如何判断是否正在主动选择某个表?我不能只使用 Profiler - 不仅我想观看几天以上,而且还有数千个存储过程,而 Profiler 不会将 SP 调用转换为表访问调用。

我唯一能想到的就是在感兴趣的表上创建聚集索引,然后监视sys.dm_db_index_usage_stats以查看聚集索引上是否有任何查找或扫描,意味着表中的数据已加载。但是,在每个表上添加聚集索引并不是一个好主意(出于多种原因),因为实际上不太可行。

我还有其他选择吗?我一直想要一个像“SELECT 触发器”这样的功能,但可能还有其他原因导致 SQL Server 没有该功能。

解决方案:

谢谢莱姆斯,为我指明了正确的方向。使用这些列,我创建了以下 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)

最佳答案

查看sys.dm_db_index_usage_stats 。列last_user_xxx 将包含上次从用户请求访问表的时间。该表会在服务器重新启动后重置其跟踪,因此您必须让它运行一段时间才能依赖其数据。

关于sql-server - 如何判断数据库表是否正在被访问?想要类似 "SELECT trigger"的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2155594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com