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

改变大表中列数据类型的最有效方法

  •  0
  • Christian  · 技术社区  · 5 年前

    varchar nvarchar 这样地:

    ALTER TABLE my_table 
        ALTER COLUMN comment NVARCHAR(250);
    

    问题是我的事务日志会一直增长,直到硬盘满为止。

    我曾考虑过大宗交易,但这基本上只是一种说法。

    当使用新数据类型创建新表时,临时表是否工作?

    CREATE TABLE my_table_new (comment NVARCHAR(250);
    
    INSERT INTO my_table_new 
        SELECT * 
        FROM my_table;
    
    -- or
    
    SELECT comment
    INTO my_table_new
    FROM my_table;
    
    DROP TABLE my_table;
    

    最好的方法是什么?

    知道如何避免事务日志文件的极端增长吗?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Gordon Linoff    5 年前

    您可能会发现创建新表、截断旧表然后重新插入的速度更快:

    select t.*
    into temp_my_table
    from my_table t;
    
    truncate table my_table;  -- back it up first!
    
    alter table mytable alter column comment nvarchar(max);  -- no need to be cheap here
    
    insert into mytable
        select t.*
        from t;
    

    一个警告:如果有insert触发器或identity列,您可能需要注意。

        2
  •  0
  •   Martin Cairney    5 年前

    Data Loading Performance Guide 包括一些关于最小记录条件的讨论。