【问题标题】:Why does a delete statement affect an additional row?为什么删除语句会影响附加行?
【发布时间】:2019-04-23 18:09:03
【问题描述】:

更新

我发现包含实际执行计划是添加额外行影响警告的罪魁祸首。

原始问题:

我正在删除几十万条不必要的记录,每批 100 条记录。

我的问题是,在每 100 行删除指令后,我看到一个警告(1 行受影响),我想知道它可能是什么。

我的表没有任何触发器,也没有与级联的关系。那么,您是否知道其他可能会影响其他行的内容?

DECLARE @LOOP bit = 1

WHILE @LOOP = 1
BEGIN
  BEGIN TRANSACTION 

  DELETE TOP (100) FICHERO_ASIGNACION
  FROM FICHERO_ASIGNACION 
       INNER JOIN FICHERO ON FICHERO.FIC_KEY = FICHERO_ASIGNACION.FIC_KEY
  WHERE FAT_KEY = 4 and 
        CLI_COD is null and
        FIC_BUC = 'prd.factura-venta'

  PRINT '100 unneeded assignments deleted'
  IF @@ROWCOUNT = 0 SET @LOOP = 0
  COMMIT TRANSACTION
END

这是结果:

(100 rows affected)

(1 row affected)
100 unneeded assignments deleted
(100 rows affected)

(1 row affected)
100 unneeded assignments deleted
(100 rows affected)

(1 row affected)
100 unneeded assignments deleted
...
...

此外,在执行计划中,我没有看到对其他表或其他搜索的任何引用。

谢谢。

【问题讨论】:

  • 我知道你说过没有触发器,但请仔细检查。此外,您的循环不应该循环 - print 将重置 @@ROWCOUNT 为 0,无论有多少行受到 DELETE 的影响。
  • 达米安,我想这就是答案......
  • 还要检查其他表中是否存在级联删除关系。
  • @AbdulRasheed - 级联删除不会报告级联表中的行数,除非我严重记错了。

标签: sql-server join sql-execution-plan


【解决方案1】:

显示执行计划似乎引发了额外的行警告。

我已删除“包括实际执行计划”,现在它没有显示任何其他受影响的行。

谢谢大家。

【讨论】:

  • 噢!我想我过去已经看到过,但从来没有考虑过,因为我通常在制定计划时已经在关注其他问题。
【解决方案2】:

它对我来说很好用。检查here。 桌子上有触发器吗?

【讨论】:

  • 比@Praveen,但我已经重新检查了好几次,我没有触发器或级联更新。
  • 所以它的执行计划!好一个:)
最近更新 更多