我有一个相当大的表: 20+百万行,我需要更新其中的5% --即100万行。
不幸的是,我正在更新用作聚集索引的(int)列。
我的问题是:更新这些行的最快方法是什么?
我已经尝试直接更新行:
update t1
set t1.groupId = t2.groupId
from
table t1
join newtable t2 on t1.email = t2.email但这需要很长时间(3个小时后我就停止了)
我假设这是因为整个行(有2个日期时间、2个varchars和2个ints)被移动到每个更新中。
如果我先删除聚集索引,然后进行更新,然后重新创建聚集索引,怎么办?那样会更快吗?
注意:我在电子邮件上有一个非聚集索引,以防有人认为查询的选择部分是慢的。事实并非如此。
发布于 2009-06-19 07:57:23
下面是我所做的(而且速度更快):
这就把整个过程缩短到了几秒钟。是的,大约15秒内有100万行。
第二步至关重要,因为外键迫使更新在相关表上执行某种假脱机操作,每个表都有大量行。
由于这些外键查找,物理读取的数量增加了两倍。
我不知道Server为什么需要这样做,但我的猜测是,即使我没有更新该列,但我正在移动整行(集群列更新),它仍然执行完整性检查。
作为附带说明,我还尝试了分批运行更新:
update top(1000) t1
set t1.groupId = t2.groupId
from
table t1
join newtable t2 on t1.email = t2.email这是很好的(似乎是每批10K左右),但它仍然是在1-2分钟每批。
总之,我已经了解到,对于批量更新,暂时删除索引可能非常有用。
发布于 2009-06-19 07:12:54
你为什么不做以下几件事:
groupId
这样应该更快些。
https://stackoverflow.com/questions/1016631
复制相似问题