【发布时间】:2016-10-22 16:09:28
【问题描述】:
我们有一个 SQL Server 2008 数据库,其中一个表包含超过 14 亿条记录。由于坐标系的调整,我们不得不将坐标列的数据类型从decimal(18, 2)扩展为decimal(18, 3)。
我们尝试了多种方法,但在执行大约 14 小时后,一切都导致异常(事务日志已满)。
这些是我们尝试过的:
-
更改表格
ALTER TABLE Adress ALTER COLUMN Coordinate decimal(18, 3) NULL -
设计师
- 取消选中
Tools > Options > Designer > Prevent saving changes that require table re-creation - 打开设计器
- 将列的数据类型更改为
decimal(18, 3) Right-click > Generate Change Script...
- 取消选中
此脚本的作用是使用新数据类型创建一个新表,将旧数据复制到新表中,删除旧表并重命名新表。
不幸的是,两次尝试都在执行 14 小时后导致事务日志完整异常。
我想,通过ALTER TABLE... ALTER COLUMN... 更改数据类型只是更改元数据,应该在(毫秒)秒内完成?
- 您知道我可以尝试的其他方法吗?
- 为什么我的尝试(尤其是 #1)需要这么多时间?
提前致谢
【问题讨论】:
-
一些表的更改可以仅作为元数据更改执行。这绝不是 all 更改,而您正在执行的更改确实需要更新每一行。所以,我猜你需要更多的日志空间。
-
试试
select CONVERT(binary(8),CONVERT(decimal(18,3),1.5)),CONVERT(binary(8),CONVERT(decimal(18,2),1.5)),你会发现表示完全不同。 -
A.表使用的空间有多大(磁盘使用情况报告)? B. 你的实验有多少磁盘空间?如果 B > A,那么您可以考虑从头开始创建新表并将数据 bcping 到它(这可以分批完成,从而最大限度地减少事务日志的使用)。作为副作用的好处,您将获得更紧凑和更少碎片化的数据组织。如果还没有使用,你也应该使用压缩
-
完整的事务日志是完整的事务日志。这与 ALTER TABLE 命令无关。日志也不是一个怪癖,它允许您取消更改或处理任何故障。如果没有日志,取消查询会给您留下一个错误的数据库。备份日志以释放任何活动记录并添加更多空间。您也可以尝试添加存储在不同磁盘上的新日志文件
-
完整的事务日志肯定与ALTER TABLE有关。数据修改正在记录在事务日志中。
标签: sql-server database sql-server-2008 tsql