我有一个包含许多表的数据库,以及许多不再使用的表。虽然我可以手动对每个表进行排序以查看它们是否仍在使用中,但这将是一项繁琐的任务。是否有任何软件/隐藏功能可用于SQL Server / Oracle数据库,这些功能将返回“过去一个月没有使用过表x,y,z”等信息“表a,b,c已被使用17今天的时代“?或者可能是通过“上次修改/选择日期”对表进行排序的方法?
或者有更好的方法可以做到这一点吗?感谢
编辑:我在执行“SELECT * FROM sys.tables ORDER BY modify_date desc”时找到了“modify_date”列,但这似乎只跟踪对表结构的修改,而不是其内容。
答案 0 :(得分:6)
将spt_values
替换为您感兴趣的表名,查询将给出上次使用它的时间以及
SELECT * FROM(SELECT COALESCE(OBJECT_NAME(s2.objectid),'Ad-Hoc') AS ProcName,execution_count,
(SELECT TOP 1 SUBSTRING(s2.TEXT,statement_start_offset / 2+1 ,
( (CASE WHEN statement_end_offset = -1
THEN (LEN(CONVERT(NVARCHAR(MAX),s2.TEXT)) * 2)
ELSE statement_end_offset END) - statement_start_offset) / 2+1)) AS sql_statement,
last_execution_time
FROM sys.dm_exec_query_stats AS s1
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2 ) x
WHERE sql_statement like '%spt_values%' -- replace here
AND sql_statement NOT like 'SELECT * FROM(SELECT coalesce(object_name(s2.objectid)%'
ORDER BY execution_count DESC
请注意,如果您重新启动此框,则会将其清除
答案 1 :(得分:1)
在Oracle中,您可以使用ASH(活动会话历史记录)查找有关使用的SQL的信息。您还可以使用Hierarchical Profiler执行代码覆盖率测试,您可以在其中查找使用或未使用存储过程的哪些部分。
如果您想知道有关表数据的更新,还可以使用DBA_TAB_MODIFICATIONS。这显示了在表或表分区上完成了多少次插入,更新,删除。生成新对象统计信息后,将从DBA_TAB_MODIFICATIONS中删除指定表的行。您仍然可以在这里获得帮助,因为您还可以查看表统计历史记录。这不会显示有关仅查询的表的任何信息。如果您真的需要了解这一点,那么您将使用ASH。
注意,对于ASH和统计信息历史记录访问,您需要诊断或调整包许可证。 (通常你会想要这个)。
答案 2 :(得分:0)
如果您使用触发器,则可以检测表上的更新插入或删除。
访问可能更加困难。
答案 3 :(得分:0)
我在元数据中使用静态分析的组合来确定SQL Server中没有依赖关系和运行时跟踪的表/列,以查看正在发生的活动。
答案 4 :(得分:0)
可能对您有用的更多查询。
select * from sys.dm_db_index_usage_stats
select * from sys.dm_db_index_operational_stats(db_id(),NULL,NULL,NULL)
select * from sys.sql_expression_dependencies /*SQL Server 2008 only*/
前两个DMV报告的差异是explained well in this blog post.
答案 5 :(得分:0)