在未达到事务日志限制的情况下更改 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 提示等),那么您可以在不终止事务日志的情况下完成此操作。
我有一个巨大的 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 提示等),那么您可以在不终止事务日志的情况下完成此操作。