全表Update语句执行方案
产品表结构如下:
ID 列2 列3 等
A2012030901000001
现增加2列截取ID 中的年份和产品类型作为查询使用分别是编号ID的如下:
ID Year Type
A2012030901000001 2012 01
脚本:
update 产品表 set Year=substring([ID],(2),(4)),Type=substring([ID],(10),(2))
问题有以下2个:
1\表中数据超过2000万条,请问这种全表update对Year和Type创建索引是否有用,有没有其他更快效率的执行方式?
2\如果执行长时间未完成,为避免锁表如何执行能及时的立刻回滚?
------解决方案--------------------全表更新:
步骤1:select 不需要更改的字段,需要更改的字段 as 新字段 into #t
from 源表
步骤2:truncate table 源表
步骤3:insert into 源表 select * from #t
------解决方案--------------------
有分区的话,分区split 出去,然后更新,更新后switch回来。
没有分区的话,都是全表扫一遍,没索引啥事儿。
个人建议,分批次处理,比如一次50W行,OK了再继续。