【问题标题】:Is there a "Code Coverage" equivalent for SQL databases?SQL 数据库是否有等效的“代码覆盖率”?
【发布时间】:2011-07-31 23:51:32
【问题描述】:

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

或者有没有更好的方法来做到这一点?谢谢

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

【问题讨论】:

    标签: sql sql-server oracle code-coverage


    【解决方案1】:

    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
    

    请记住,如果您重新启动该框,这将被清除

    【讨论】:

    • 在分离/重新连接或服务器重新启动时是否会重置?
    • 是的,如果你重启盒子,它会被重置
    • 抱歉,我不确定我是否理解您所说的重启机器的意思。重启服务器?
    • 不错。我开始对此回答“不”,所以这是很好的信息。
    • 谢谢,这为我节省了几个小时
    【解决方案2】:

    如果您使用触发器,您可以检测表上的更新插入或删除。

    访问可能更困难。

    【讨论】:

      【解决方案3】:

      我在元数据中使用静态分析的组合来确定没有依赖关系的表/列和 SQL Server 中的运行时跟踪,以查看正在发生的活动。

      【讨论】:

      • 这样可以得到准确的跨数据库依赖信息吗?
      • @JNK 否 - 您仅限于数据库边界。与任何“客户端”代码相同。只有痕迹才能真正告诉您是否可以尝试某些事情。
      • 对于 SQL Server 2008 sys.sql_expression_dependencies 具有引用数据库和服务器名称的列。
      【解决方案4】:

      更多可能对您有用的查询。

      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*/
      

      前 2 个 DMV 报告的区别是 explained well in this blog post.

      【讨论】:

        【解决方案5】:

        在 Oracle 中,您可以使用 ASH(活动会话历史记录)来查找有关使用的 SQL 的信息。您还可以使用 Hierarchical profiler 执行代码覆盖率测试,您可以在其中找到存储过程的哪些部分已使用或未使用。

        如果您想知道表数据的更新,您也可以使用 DBA_TAB_MODIFICATIONS。这显示了在表或表分区上完成了多少次插入、更新、删除。一旦生成新的对象统计信息,指定表的行就会从 DBA_TAB_MODIFICATIONS 中删除。您仍然可以在这里获得帮助,因为您还可以查看表统计历史记录。这不会显示有关仅查询的表的任何内容。如果你真的需要了解这个,你可以使用 ASH。

        注意,对于 ASH 和统计历史记录访​​问,您确实需要诊断或调整包许可证。 (通常你会想要这个)。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2012-07-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-30
            • 2015-09-24
            • 1970-01-01
            相关资源
            最近更新 更多