SQL数据库是否有“代码覆盖率”等价物?

时间:2011-04-07 19:39:58

标签: sql sql-server oracle code-coverage

我有一个包含许多表的数据库,以及许多不再使用的表。虽然我可以手动对每个表进行排序以查看它们是否仍在使用中,但这将是一项繁琐的任务。是否有任何软件/隐藏功能可用于SQL Server / Oracle数据库,这些功能将返回“过去一个月没有使用过表x,y,z”等信息“表a,b,c已被使用17今天的时代“?或者可能是通过“上次修改/选择日期”对表进行排序的方法?

或者有更好的方法可以做到这一点吗?感谢

编辑:我在执行“SELECT * FROM sys.tables ORDER BY modify_date desc”时找到了“modify_date”列,但这似乎只跟踪对表结构的修改,而不是其内容。

6 个答案:

答案 0 :(得分:6)

spt_values替换为您感兴趣的表名,查询将给出上次使用它的时间以及

使用的内容

从这里开始:Finding Out How Many Times A Table Is Being Used In Ad Hoc Or Procedure Calls In SQL Server 2005 And 2008

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)

Ed Elliott的开源工具SQL Cover是一个不错的选择,并且内置了对流行的单元测试工具tSQLt的支持。