首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何加快集群列的大规模更新?

如何加快集群列的大规模更新?
EN

Stack Overflow用户
提问于 2009-06-19 06:37:40
回答 2查看 2.6K关注 0票数 7

我有一个相当大的表: 20+百万行,我需要更新其中的5% --即100万行。

不幸的是,我正在更新用作聚集索引的(int)列。

我的问题是:更新这些行的最快方法是什么?

我已经尝试直接更新行:

代码语言:javascript
复制
update t1
set t1.groupId = t2.groupId
from
    table t1
join newtable t2 on t1.email = t2.email

但这需要很长时间(3个小时后我就停止了)

我假设这是因为整个行(有2个日期时间、2个varchars和2个ints)被移动到每个更新中。

如果我先删除聚集索引,然后进行更新,然后重新创建聚集索引,怎么办?那样会更快吗?

注意:我在电子邮件上有一个非聚集索引,以防有人认为查询的选择部分是慢的。事实并非如此。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-19 07:57:23

下面是我所做的(而且速度更快):

  1. I删除了聚集索引。
  2. I还删除了外键引用(另外两个int列)。
  3. 运行了update语句
  4. I重新创建索引,比预期的速度更快。(这是我第一次问的原由)。

这就把整个过程缩短到了几秒钟。是的,大约15秒内有100万行。

第二步至关重要,因为外键迫使更新在相关表上执行某种假脱机操作,每个表都有大量行。

由于这些外键查找,物理读取的数量增加了两倍。

我不知道Server为什么需要这样做,但我的猜测是,即使我没有更新该列,但我正在移动整行(集群列更新),它仍然执行完整性检查。

作为附带说明,我还尝试了分批运行更新:

代码语言:javascript
复制
update top(1000) t1
set t1.groupId = t2.groupId
from
    table t1
join newtable t2 on t1.email = t2.email

这是很好的(似乎是每批10K左右),但它仍然是在1-2分钟每批。

总之,我已经了解到,对于批量更新,暂时删除索引可能非常有用。

票数 8
EN

Stack Overflow用户

发布于 2009-06-19 07:12:54

你为什么不做以下几件事:

groupId

  • update

  • Then
  • 创建不同的列(varchar之一)聚集索引
  • ,在您的
  • 上创建一个索引,反转这个过程。

这样应该更快些。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1016631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档