sql-server - 如何在没有日志的情况下删除SQL表中的大数据?

标签 sql-server sql-server-2008 sql-optimization

我有一个很大的数据表。 该表中有 1000 万条记录。

此查询的最佳方式是什么

   Delete LargeTable where readTime < dateadd(MONTH,-7,GETDATE())

最佳答案

  1. 如果要删除该表中的所有行,最简单的选项是截断表,例如

     TRUNCATE TABLE LargeTable
     GO
    

截断表只会清空表,您不能使用 WHERE 子句来限制被删除的行,并且不会触发任何触发器。

  • 另一方面,如果您要删除超过 80-90% 的数据,假设您总共有 1100 万行,并且您想要删除 1000 万行,另一种方法是插入这 100 万行(您想要保留的记录)到另一个临时表。截断这个大表并插入回这 100 万行。

  • 或者,如果以这个大表作为其基础表的权限/ View 或其他对象不会因删除此表而受到影响,您可以将这些相对少量的行放入另一个表中,然后删除此表并创建另一个具有相同架构的表,并将这些行导入回这个前大型表中。

  • 我能想到的最后一个选择是将数据库的恢复模式更改为 SIMPLE,然后使用 while 循环小批量删除行,如下所示:

     DECLARE @Deleted_Rows INT;
     SET @Deleted_Rows = 1;
    
    
     WHILE (@Deleted_Rows > 0)
       BEGIN
        -- Delete some small number of rows at a time
          DELETE TOP (10000)  LargeTable 
          WHERE readTime < dateadd(MONTH,-7,GETDATE())
    
       SET @Deleted_Rows = @@ROWCOUNT;
     END
    
  • 并且不要忘记将恢复模式更改回完整模式,我认为您必须进行备份才能使其完全有效(更改或恢复模式)。

    关于sql-server - 如何在没有日志的情况下删除SQL表中的大数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24213299/

    相关文章:

    sql-server - 哪个工具可以帮助从 E-R 图生成 SQL Server 2005/2008 数据库?

    sql - 使用 where 子句选择具有最大日期时间的所有记录

    sql - 如何给sql server用户授予sendmail权限?

    sql - 如何获取上个月数据和本月至今数据

    sql - 消除 SQL 中的交叉连接

    sql - mysql "group by"查询非常慢

    sql - 使用自动增量键插入的多行的序号

    algorithm - 根据平均值选择不同的行组

    php - mysql查询优化——索引

    sql - 获取另一个唯一 ID 中每个唯一 ID 的平均条目数