在未达到事务日志限制的情况下更改 table 中的数据类型

Changing a datatype in a table without reaching the transaction log limits

我有一个巨大的 table,在 SQL 服务器中有大约 1 亿行,我想将数据类型从 varchar 更改为 nvarchar,如下所示:

ALTER TABLE my_table 
    ALTER COLUMN comment NVARCHAR(250);

问题是我的事务日志一直增长到硬盘满了。

我考虑过一种批量交易,但这基本上只是一个声明。

当使用新数据类型创建新 table 时,临时 table 是否有效?

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;

执行此操作的最佳方法是什么?

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

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

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;

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

Data Loading Performance Guide 上的以下内容包含一些关于最小日志记录条件的讨论。

如果您能满足这些要求(包括将数据库设置为大容量日志记录或简单持续时间、使用 TABLOCK 提示等),那么您可以在不终止事务日志的情况下完成此操作。