确定从日志中更新了多少行的方法

Way to identify how many rows got updated from logs

我们处理来自上游系统的 CSV 文件,并将它们加载到 SQL 服务器数据库中的主 table。我们目前正在登上一个新的上游系统,突然我们的 UPDATE 语句花费了很长时间。这可能是由于传入的数据在我们的系统中具有以前的相关数据,并且导致了巨大的更新。我们能够找出正在通过 sp_whoisactive 更新的 table。

我的查询是:

让我们先从你的第三个问题开始。是的。如果您真的想跟踪更改的特定值,最好的方法是通过扩展事件,并且您必须提前设置并设置它 运行ning。正如您将在本 post 的其余部分看到的那样,可能没有简单的方法来检索您要查找的特定信息,具体取决于。 sql_statement_completed 之类的内容将为您提供给定事件的精确行数。您可以将其过滤到特定的 table.

第二个问题,在更新期间,您无法真正看到事务中准确更新了多少行。但是,您可以猜测可能会更新多少行。执行计划将具有它预期会发生的行估计。所以,你可以从 sys.dm_exec_query_plan 查询这个。将其与 sys.dm_exec_sql_batch 组合以查找查询。我确定 sp_whoisactive 也可以提供此信息(它只是查询 DMV)。如果您提前正确设置了服务器,也可以观看 Live Query Statistics。这将为您提供估计的行数,但随后会显示实际发生的情况。

现在是棘手的问题。你能在事后得到行数吗?有点儿。如果查询刚刚执行并且没有再次执行,sys.dm_exec_sql_batch 确实有一个 last_rows 列将提供该信息。但是,如果不止一个查询具有 运行,则该信息将丢失,因为它只是最近执行的查询。如果您使用的是 Azure SQL 数据库或 SQL Server 2019,您还可以 look to sys.dm_exec_query_plan_stats 查看最后的执行计划和运行时指标。这也将有行计数 虽然,如果这就是您要查找的全部内容,并且这是最近的执行,那么批处理 DMV 会更容易。不知道sp_whoisactive里有没有那一栏,不过你可以自己去车管所查询一下。

但是,如果查询 运行 不止一次,那你就不走运了。如前所述,您可以查看执行计划以查看行估计值。如果查询等待超过 30 秒,它将显示在 system_health 扩展事件会话中,但不包括行数。真的,除非是最后一次精确查询 运行,否则事后无法获取行计数值。