如何快速修改 表字段 的属性,前提是这个表里有上千万条数据。

wxylvmnn 2016-12-14 01:40:26
SQL2012

比如,字段A,现在定义是INT,我想给改成NVARCHAR(100)

最普通的做法是执行,
ALTER TABLE 表 ALTER column 字段A NVARCHAR(100);

但是现在的问题是,这个表中有上千万条数据,这么执行的话,速度慢的不行不行的了,刚才执行了近半个小时,没完事,被我强制终了了。

有什么好的方法。。。
...全文
726 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
卖水果的net 版主 2016-12-14
  • 打赏
  • 举报
回复
增加一列,批量更过来,比如每次 1000 行; 再清空原来的列,再修改类型,再批量更新来,最后删除刚才的表; PS:如是原来的列上有索引(主键),要先删除索引(主键),并且注意非空约束;
足球不是方的 2016-12-14
  • 打赏
  • 举报
回复
如果只是修改1列或者2列,可以增加1,2列,类型是需要改动的类型,把相应列的数据更新到此列,可以做个触发器,最后删除以前的列,吧新增的列改成以前列的列名
闭包客 2016-12-14
  • 打赏
  • 举报
回复
在数据量大的数据库里面执行耗时长的事务时,有一种分割成若干小事务的做法。 比如你在现有表的基础上创建一个新表,把列改成 NVARCHAR(100) 然后把数据以一万条为一个事务导入进去,这样即使某个事务意外中断,以后还可以接着以前的进度继续导入。 在数据完全导入完毕之后,把旧表改名,新表使用旧表的名称。
LongRui888 2016-12-14
  • 打赏
  • 举报
回复
建议还是在业务比较空闲时,特别是晚上操作吧,最好是停服维护时执行。 这个说白了这个就类似于一个update语句,更新几千万的数据,加上类型要变化,速度会比update 几千万数据更慢一些。
LongRui888 2016-12-14
  • 打赏
  • 举报
回复
在修改字段类型时,会检查每一列的值,进行类型转换,把值改为 字符串的值,而且会加上sch-m锁,防止其他会话来修改。 加上你的数据量非常大,所以速度非常慢。 首先,建议在alter 语句后面加上online,其次,别在现在改,最多也就是在晚上维护期间让运维改一下。 还有个办法就是,创建一张新表,把字段改为varchar,然后把原始表的数据导入到新的表里,最后把原始表truncate,把新表的表名改成原始表。 为了防止在这个期间有数据修改,可以先锁定整张表,方式表被修改。
  • 打赏
  • 举报
回复
update T1 SET A=CAST(A AS NVARCHAR(100)) 再 ALTER TABLE 表 ALTER column 字段A NVARCHAR(100);

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧