sql - 在未达到事务日志限制的情况下更改表中的数据类型
问题描述
我在 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;
做到这一点的最佳方法是什么?
知道如何避免事务日志文件的极端增长吗?
解决方案
您可能会发现创建新表、截断旧表然后重新插入会更快:
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;
一个警告:如果您有插入触发器或标识列,您可能需要注意。
推荐阅读
- android - Sqldelight 1.4 如何在没有主键(id)的情况下插入填充数据生成对象
- html - 加载资源失败,错误 net::ERR_ABORTED 404(未找到)
- python - 如何创建 pandas.Interval 对象的联合
- node.js - 阻止除前端之外的任何其他资源的 API 访问
- javascript - 获取错误的 URL 结尾
- python - Python - 尽管关闭/刷新文件对象,文件追加/写入不会写入文件
- python - rasterio 使用 shapefile 剪辑栅格
- mysql - RDS MySQL 一旦过程出现错误,它会重复直到启动新会话,即使使用有效值
- java - JUnit && Mockito
- python - 将列表值与字典比较python