代码之家  ›  专栏  ›  技术社区  ›  duduamar

更改表中的两列-有风险的操作?

  •  2
  • duduamar  · 技术社区  · 14 年前

    在MSSQL server 2005上,我有一个表,它有大约100列,大约3000万行。

    我担心这样做会填满日志,导致操作失败。我怎样才能估计这种操作所需的可用磁盘空间,包括数据和日志,以确保它不会失败?

    4 回复  |  直到 14 年前
        1
  •  1
  •   Remus Rusanu    14 年前

    您是对的,增加列大小(包括最大值)将为一个大表生成一个巨大的日志,因为每一行都将被更新(在场景后面,旧列被删除,新列被添加,数据被复制)。

    1. 添加类型为的新列 VARCHAR(MAX) NULL . 作为可空列,将仅作为元数据添加(无数据更新)
    2. 放下旧的柱子。这将是一个仅限元数据的操作。
    3. sp_rename 将新列重命名为旧列名。

    这样,您就可以通过在步骤2控制批处理来控制日志。您还可以通过不将整个表复制到新表中(SSMS做得很差…)来最小化对权限、约束和关系的中断。

    您可以同时对两列执行此序列。

        2
  •  1
  •   Michael Goldshteyn    14 年前

    我建议你考虑:

    1. 使用新架构创建新表
    2. 将数据从旧表复制到新表
    3. 将新表重命名为旧表的名称

    这可能是一个成本低得多的操作,并且可以使用INSERT/SELECT(如果这是SQL Server 2008或更高版本)以最少的日志记录完成。

        3
  •  1
  •   Joshua    14 年前

        4
  •  0
  •   Gábor Lipták    14 年前

    试着用小块做一些测试。我的意思是,你可以用几千行在本地创建相同的结构,然后看看前后的区别。我认为变化是线性的。真正的问题是重做日志,它是否适合它,因为您可以一次完成它。你必须在网上做,否则你可以暂停生产一段时间?如果您可以停止,也许有一种方法可以像在Oracle中一样停止MSSQL中的重做日志。它可以使它更快。如果需要联机,可以尝试创建一个新列,按周期将值复制到其中,例如一次复制100000行,提交,继续。完成后,删除原始列并重命名新列可能比更改更快。