gpt4 book ai didi

sql - 如何加快聚集列的大规模更新?

转载 作者:行者123 更新时间:2023-12-04 11:46:09 27 4
gpt4 key购买 nike

我有一个非常大的表: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 个整数)。

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

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

最佳答案

这是我所做的(而且速度要快得多):

  • 我删除了聚集索引。
  • 我也删除了外键
    引用(另外两个 int
    列)。
  • 我运行了更新语句
  • 我重新创建了索引,这比预期的要快。 (这是我首先问 SO 的最初原因)。

  • 这使整个过程缩短到几秒钟。 是的,大约 15 秒内约 100 万行。

    第二步至关重要,因为外键强制更新对相关表执行某种假脱机操作,每个表也有大量行。

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

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

    作为旁注,我还尝试分批运行更新:
    update top(1000) t1
    set t1.groupId = t2.groupId
    from
    table t1
    join newtable t2 on t1.email = t2.email

    这很好(并且每批似乎可以扩展到大约 10K),但每批仍然需要 1-2 分钟。

    总之,我了解到对于批量更新,临时删除索引非常有帮助。

    关于sql - 如何加快聚集列的大规模更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1016631/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com