【问题标题】:best number of rows to delete in a delete query [closed]在删除查询中删除的最佳行数[关闭]
【发布时间】:2015-07-26 14:21:04
【问题描述】:

我正在使用 SQL Server,并且我有一个很大的表。

如果我们使用delete from table 查询,我们会跳转到事务日志。 我应该使用这样的查询

delete top (@count) from table

然后我应该把它放在我的 asp.net 代码中。

我的问题是实现这些目标的最佳@count 金额:

  • 该表将能够在删除过程中响应其他查询
  • 事务日志文件中没有跳转
  • 删除所有行的速度超快(我有数十万行)

补充资料: 这是一个 item_in_tags 表,它存储项目 ID 和标签 ID,因此当我想重新标记所有项目时,它有很多行我需要删除其中的所有内容,然后将数据输入到表中我不能进行非常大的事务,因为主机不接受跳转事务日志,我没有收缩权限。 我想保持事务的大小和快速,但我也想获得最佳性能,并且在重新标记过程中我不想因为表锁定等问题而停机。

【问题讨论】:

  • 如果你想删除所有表为什么不使用TRUNCATE TABLE
  • 在截断表之前,您需要删除该表的所有外键约束(如果有)
  • 谢谢,我不知道,也没有用过!
  • SQL Server 如何处理锁定5000 行的限制 - 对于事务中的 5000 行(或更少),它将锁定个别行被删除 - 如果您的事务一次删除超过 5000 行,SQL Server 将执行 锁升级 并锁定 整个表,这意味着您甚至不能再读一遍。这可能是批量删除时要记住的一个阈值...

标签: sql asp.net sql-server tsql


【解决方案1】:

以下是您所询问范围内的不同场景:

  1. 您想删除表格中的所有内容。那么truncate table 是正确的做法。

  2. 您的删除查询需要进行全表扫描以识别被删除的行。那么更大的数字可能会更好,以减少全表扫描的次数。

  3. 您在表上有非常复杂的触发器或级联操作。在这种情况下,“1”可能是最佳答案。

  4. 其他查询正在修改表,因此您可能会遇到锁定冲突和超时的问题。在这种情况下,您可能需要等到系统安静下来后再进行工作。

  5. 其他操作是只读的,不需要查看删除。在这种情况下,选择另一个表并在该表不使用时使用sp_rename 可能是最有效的解决方案。

而且,毫无疑问还有其他情况。我的建议是选择一个数字,例如 100 或 1000,然后就可以了。如果删除似乎干扰其他操作,请减少数量。

【讨论】:

  • @MohammadHa 。 . .根据您的修改,我建议(5)。重新创建您需要的表,然后删除/重命名或截断/插入以将正确的数据放入其中。
【解决方案2】:

Microsoft 过去对许多操作默认为 1000 行,现在它在 SSIS 等其他地方默认为一次 10000 行。许多开发人员使用 10000 作为大型事务的行数,但您可能希望使用该数字来查看(在具有自己的内存和硬盘的系统上)以查看更大或更小的数字是否更快完成。

【讨论】:

    【解决方案3】:

    或者,您可以尝试这种方法,将要保留在临时表中的记录插入到临时表中,然后截断您的实际表。然后,将这些临时表记录传输回您的实际表中。不确定您会从中获得多少性能增益,但绝对会建议您在执行此操作之前执行BACKUP

    SELECT item_id,
           tag_id
    INTO #Holdingtable
    FROM item_in_tags 
    WHERE items_id IN (***items you want to keep****)         
    
    
    TRUNCATE TABLE item_in_tags
    
    INSERT into item_in_tags     
    SELECT 
         item_id,
         tag_id
    FROM #Holdingtable
    

    【讨论】:

      【解决方案4】:

      您想快速删除记录对吧? 截断表 将是最佳选择,尤其是在您不想记录数据的情况下。如果您想从该表中保留一些记录,我会先将这些记录插入到临时表中,然后在表被截断后将它们插入回实际表中。

      【讨论】:

      • 我在使用从表查询中删除的问题是由于日志文件而导致数据库大小跳跃。所以我不得不使事务更小,并多次从表中删除 1000。现在你说截断表没有记录!真的吗?如果我截断所有表不会发生跳转?
      【解决方案5】:

      用户Truncate Table myTable 如果您在该表上没有需要触发的触发器。可以把它想象成基本上是在表格顶部打了一个 END-OF-FILE 标记。

      【讨论】:

      • 我看不懂最后一句话,请您再解释一下最后一句话吗?提前致谢
      • 它不会逐行删除,它只是将其截断,因此它们在表中没有行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      相关资源
      最近更新 更多