跟踪 Microsoft SQL 服务器中的列或表的使用情况

跟踪 Microsoft SQL 服务器中的列或表的使用情况

我们拥有一批非常老旧、设计糟糕的数据库,我已获准拆除并重组它们。然而,这些数据库没有规范化,许多字段多年来一直处于空白状态,或在没有文档的情况下被重新利用,我们有大量的遗留应用程序和公共网站使用这些数据的各个部分,但内部没有人知道这些数据对哪些部分做了什么。

我如何确定这些表中的哪些字段正在使用?在 SQL 服务器中是否有办法查看使用历史记录,或者如果需要可以使用第三方工具?或者设置一些额外的日志来确定这种使用情况?“使用情况”理想情况下是指上次更新或插入的时间,以及在 select 语句中包含的时间或频率。

除此之外,我们正在从 SQL 2005 迁移到 2008。因此,使用任一服务器类型的解决方案都可以工作,因为我应该能够使 05 dbs 达到 08 合规性。

答案1

就我个人而言,我会使用 DMV 作为我的初步调查,以寻找主要活动。这可以帮助您确定调查目标,以便您可以创建正确的分析器跟踪。(正如 Sam 提到的,您需要小心处理这些,以免造成性能问题。)

既然你提到你可以选择使用 sql 2008,那么新的审计功能可能对你有用。

以下是我建议大家看的内容:

使用索引 DMV 查找对象访问

两个 DMV 将是最有用的:sys.dm_db_index_usage_stats(BOL这里) 和sys.dm_db_missing_index_details(BOL这里)。

在缓存中查找最频繁和影响最大的查询

使用sys.dm_exec_query_stats查询来查找最常运行的查询。BOL这里

祝你好运!

答案2

从现在起,可以通过 SQL Server 跟踪来审计选择语句。它们不存储在日志中。您的日志保存数据修改,可以使用一些流行的 SQL 实用程序供应商提供的第三方工具进行检查。您还可以在所有表​​上使用触发器来审计修改 - 但它们不会捕获选择。

对生产中的所有选择语句运行“广泛”跟踪是不建议。 如果可能的话,将其移至开发阶段并设置一些测试。

c2 审计也许也能帮到你,但我不知道它实际收集了哪些细节。

此外,浏览应用程序代码也是一个很好的调查地点。

答案3

您可以使用 SQL 事件探查器运行跟踪,让它运行一段时间,然后在输出中执行“查找”以查找您关心的字段名称。

另一个选择是您可以在 SQL 服务器中创建一个触发器并将该信息记录到另一个表中。

IE,

    CREATE TRIGGER Audit 
    ON dbo.Employee 
    FOR INSERT, UPDATE, DELETE 
AS 
    IF (SELECT COUNT(*) FROM inserted) > 0 
    BEGIN 
        IF (SELECT COUNT(*) FROM deleted) > 0 
        BEGIN 
            -- update! 
            INSERT AuditEmployee 
            (EmployeeID, UserName, Operation) 
            SELECT EmployeeID, SUSER_SNAME(), 'U' 
            FROM inserted 
        END 
        ELSE 
        BEGIN 
            -- insert! 
            INSERT AuditEmployee 
            (EmployeeID, UserName, Operation) 
            SELECT EmployeeID, SUSER_SNAME(), 'I' 
            FROM inserted 
        END 
    END 
    ELSE 
    BEGIN 
        -- delete! 
        INSERT AuditEmployee 
        (EmployeeID, UserName, Operation) 
        SELECT EmployeeID, SUSER_SNAME(), 'D' 
        FROM deleted 
    END 
GO

该示例摘自http://sqlserver2000.databases.aspfaq.com/how-do-i-audit-changes-to-sql-server-data.html。要存储列名称,您可以将该变量添加到插入语句中。请参阅http://www.devx.com/dbzone/Article/7939/1954再举一个例子。

相关内容