【问题标题】:SQL Server - cleaning up huge table. Insert data we want to keep and truncate old tableSQL Server - 清理巨大的表。插入我们想要保留的数据并截断旧表
【发布时间】:2020-07-12 05:23:45
【问题描述】:

我们的应用在 SQL Server 中有几个非常大的表。我们要清理两个表中的 5 亿行和 10 亿行以回收一些磁盘空间。

在我们的测试环境中,我尝试在循环中运行分块删除,但我认为这在 prod 中不是一个可行的解决方案。

所以另一种选择是选择/插入我们要保留的数据到临时表中,截断/删除旧表,然后重新创建

  1. 索引
  2. 外键约束
  3. 表权限
  4. 将临时表重命名回原来的表名

我的问题是,我是否遗漏了清单中的任何内容?是否还有其他我们将丢失的对象/结构需要重新创建或恢复?如果出现问题,那将是灾难性的情况。所以我玩这个非常安全。

调整数据库大小/添加更多空间不是一个可行的解决方案。我们的 SQL Server 应用程序的生命周期即将结束,并且正在被淘汰,因此在此之前我们只是保持亮灯状态。

【问题讨论】:

    标签: sql sql-server clone truncate


    【解决方案1】:

    在您执行此操作时,是否会在原始表中添加新记录?我的意思是写到这张表的应用程序会上线吗?如果是这种情况,也许最好更改步骤的顺序,例如:

    1. 首先将原始表的名称重命名为临时表
    2. 使用原始名称创建一个新表,以便可以从写作应用添加新记录。
    3. 同时,您可以将要保留的数据从临时表移动到新的原始表中。

    【讨论】:

    • 谢谢。这是一个好主意。我们不期待写入,因为我们将在休息时间执行此操作,例如周六早上。除了索引、外键、权限之外,还有其他对象需要恢复吗?
    • 您已经编写了索引和键。只是添加到您的列表中,如果您在原始表中有任何触发器,则会触发。我不是数据库专家,但据我所知,这应该足够了。只要确保即使您将在星期六开始,这取决于从原始数据读取和写入临时数据的大小和查询性能不会超过您的估计。如果操作在中间以某种方式终止,则可能会出现问题,SQL Server 将尝试回滚,这将比正常操作花费两倍的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2019-03-04
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多