gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:07:41 27 4
gpt4 key购买 nike

在论坛的数据库中,我错误地将正文设置为 nvarchar(MAX) .好吧,当然有人发布了大英百科全书。所以现在有一个论坛主题不会因为这个帖子而加载。我已经确定了该帖子并对其运行了删除查询,但由于某种原因,该查询只是静止不动。我已经让它离开了几个小时,它只是坐在那里。最终它会超时。

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

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

更新:抱歉,SQL Server 的版本是 2008。

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

DELETE FROM [u413].[replies] WHERE replyID=13461

我还尝试删除与回复有关的主题本身,并将主题级联删除到相关回复。这也挂了。

最佳答案

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

  • 将数据复制到新表:
    SELECT *
    INTO tempTable
    FROM replies WITH (NOLOCK)
    WHERE replyID != 13461

    虽然需要时间,但在复制过程中不应锁定表
  • 放下旧 table
    DROP TABLE replies

    在你放下之前:
    - 编写当前索引和触发器的脚本,以便您以后可以重新创建它们
    - 编写脚本并将所有外键删除到表
  • 重命名新表
    sp_rename 'tempTable', 'replies'
  • 重新创建所有外键、索引和触发器。

  • 选项 2。分区。
  • 添加一个新的位列,称为“分区”,对于除坏行之外的所有行都设置为 0。将其设置为 1 表示坏的。
  • 创建分区函数,以便有两个分区 0 和 1。
  • 创建一个与原始表结构相同的临时表。
  • 将分区 1 从原始表切换到新的临时表。
  • 删除临时表。
  • 从源表中删除分区并删除新列。

  • 分区主题并不简单。互联网上有一些例子,例如 Partition switching in SQL Server 2005

    关于sql - 如何从 SQL Server 中删除大记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6448673/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com