如何从SQL Server中删除大型记录?

Che*_*hev 12 sql sql-server-2008 sql-update sql-delete

在论坛的数据库中,我错误地将主体设置为nvarchar(MAX).当然,有人发布了英国百科全书百科全书.所以现在有一个论坛主题因为这一篇文章而无法加载.我已经确定了帖子并对其进行了删除查询,但由于某种原因,查询只是坐下并旋转.我已经放了几个小时,它只是坐在那里.最终会超时.

我也尝试过编辑帖子的主体,但也可以坐着并挂起.当我坐下来让我的查询运行整个数据库挂起,所以我同时关闭该网站,以防止进一步的请求,而它正在思考.如果我取消我的查询,那么该网站将恢复正常,并且所有不涉及该问题的记录的查询都会非常有效.

其他人遇到过这个问题吗?有没有一种简单的方法来粉碎这个邪恶的记录?

更新:对不起,SQL Server的版本是2008.

这是我正在运行的删除记录的查询:

DELETE FROM [u413].[replies] WHERE replyID=13461
Run Code Online (Sandbox Code Playgroud)

我还尝试删除主题本身,该主题与回复和删除相关回复的主题上的回复和删除有关系.这也很常见.

Ale*_*Aza 4

选项 1。取决于表本身有多大以及行有多大。

  1. 将数据复制到新表:

    SELECT *
    INTO tempTable
    FROM replies WITH (NOLOCK)
    WHERE replyID != 13461
    
    Run Code Online (Sandbox Code Playgroud)

    尽管需要时间,但在复制过程中不应该锁定表

  2. 删除旧表

    DROP TABLE replies
    
    Run Code Online (Sandbox Code Playgroud)

    在删除之前:
    - 编写当前索引和触发器的脚本,以便稍后能够重新创建它们
    - 编写脚本并将所有外键删除到表中

  3. 重命名新表

    sp_rename 'tempTable', 'replies'
    
    Run Code Online (Sandbox Code Playgroud)
  4. 重新创建所有外键、索引和触发器。

选项 2.分区。

  1. 添加一个新的位列,称为“分区”,将除坏行之外的所有行设置为 0。将其设置为 1 表示不好。

  2. 创建分区函数,以便有两个分区 0 和 1。

  3. 创建一个与原始表结构相同的临时表。

  4. 将分区 1 从原始表切换到新临时表。

  5. 删除临时表。

  6. 从源表中删除分区并删除新列。

分区主题并不简单。互联网上有一些例子,例如SQL Server 2005 中的分区切换