代码之家  ›  专栏  ›  技术社区  ›  MrTelly

SQL Server,查找由语句更新的所有行

  •  1
  • MrTelly  · 技术社区  · 14 年前

    有没有一种方法可以找到由单个语句更新的所有行,SQL本身必须跟踪这些行,因为它可以在需要时回滚更新。我有兴趣找到所有更改的行,因为我正在使用更新触发器获得性能冲击。

    我在SQL Server中有一些大型(2M-10M)行表,我正在添加审计触发器来跟踪记录的更新时间以及更新的内容,问题是这会扼杀性能。大多数针对该表的更新将达到20000多行,现在它们所花费的时间是以前的5-10倍。

    我想了一些选择

    1)完全丢弃触发器,并将审计字段添加到每个更新语句中,但这取决于每个人的代码都在被更改。 2)在字段上使用before/after校验和值,然后再次使用它们更新更改的行,仍然会影响性能。

    还有人解决了这个问题吗?

    3 回复  |  直到 14 年前
        1
  •  2
  •   MrTelly    14 年前

    在插入和删除的伪列中,更新触发器已经具有受更新语句影响的记录。您可以将它们的主键列选择到充当队列的初步审计表中,并将更复杂的计算移动到单独的作业中。

    另一个选择是 OUTPUT 用于更新语句的子句,该语句是在SQL Server 2005中引入的。(Philip Kelley评论后更新)

        2
  •  2
  •   munissor    14 年前

    SQLServer知道如何回滚,因为它有事务日志。不是可以在数据表中找到的内容。

    您可以尝试向行中添加时间戳列,然后保存“当前”时间戳,更新所有行。更改的行应该是时间戳大于“当前”时间戳的所有行。这将帮助您查找已更改的行,但不查找已更改的行。

        3
  •  1
  •   Remus Rusanu    14 年前

    你可以使用 Change Tracking Change Data Capture . 这些技术内置于引擎中,用于跟踪更改,并利用复制基础结构(日志读取器或表触发器)。两者都只在SQL Server 2008或2008 R2中可用,CDC需要企业版许可。

    你想做的其他事情最终会归结为:

    • 正在读取更改日志(只有复制才能执行,包括更改数据捕获,否则引擎将在您可以读取日志之前回收该日志)
    • 跟踪触发器中的更改(这是更改跟踪将使用的内容)
    • 跟踪应用程序中的更改

    没有免费的午餐。如果审计是一项要求,那么必须考虑审计的开销,并且必须相应地进行能力规划。所有数据审计解决方案将 重要的 管理费用,因此运营成本增加2倍、4倍甚至10倍的因素并非闻所未闻。