在不达到事务日志限制的情况下更改巨大表中列数据类型的最有效方法

问题描述 投票:0回答:1

我在SQL Server中有一个约有1亿行的巨大表,并希望将数据类型从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;

什么是最好的方法?

任何想法我如何避免交易日志文件的极端增长?

sql sql-server transactions alter-table select-into
1个回答
1
投票

您可能会发现创建新表,截断旧表并重新插入它更快:

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;

一个警告:如果您有插入触发器或标识列,则可能要注意。

© www.soinside.com 2019 - 2024. All rights reserved.