首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -更新大表(9亿)记录的查询性能

SQL -更新大表(9亿)记录的查询性能
EN

Stack Overflow用户
提问于 2017-02-12 19:34:01
回答 3查看 1.3K关注 0票数 2

我有一个包含9亿条记录的数据库表。在这种情况下,我需要更新该表中的4个不同的键,方法是将它们连接到一个维度,并将事实表的键设置为该维的键。我已经写了4个不同的SQL脚本(见下面的例子)来执行更新,但问题是它执行的时间太长了。查询已经运行了20多个小时,我甚至不确定它会走多远,需要多长时间。有没有什么办法可以改进这一点,这样只需要几个小时就能完成。添加索引会改善这一点吗?

代码语言:javascript
复制
UPDATE f
SET f.ClientKey = c.ClientKey
FROM dbo.FactSales f
JOIN dbo.DimClient c
ON f.ClientId = c.ClientId
EN

回答 3

Stack Overflow用户

发布于 2017-02-12 20:00:27

  1. 脚本外键。删除它们。已更新列(不是条件的一部分)上的
  2. 脚本索引。删除它们。如果存在,请禁用触发器。keys.
  3. Recreate
  4. 禁用所有可以设置锁的进程(= all,包括您的外键,索引,启用触发器。
  5. 将快乐。

和注释5-仅使用所有新的源代码从目标表中准备主键,并执行一条语句。这意味着join的成本更低,而且它将只有一个join。

票数 0
EN

Stack Overflow用户

发布于 2017-02-12 20:57:24

可以使用它来不填满事务日志

代码语言:javascript
复制
select 1 
while(@@rowcount > 0)
begin 
    UPDATE f
    SET top (100000) f.ClientKey = c.ClientKey
    FROM dbo.FactSales f
    JOIN dbo.DimClient c
    ON  f.ClientId   = c.ClientId 
    AND f.ClientKey != c.ClientKey
end

如果你需要更新4个不同的密钥,那么你可以一次更新所有的密钥

大部分成本都是获取锁

禁用f.ClientKey,运行更新,然后重新构建它

如果您确定DimClient不会更改with (nolock),但需要确保

如果您是唯一需要更新FactSales进程,请使用tablock holdlock

票数 0
EN

Stack Overflow用户

发布于 2017-02-14 14:36:21

使用正确的值创建一个新表。之后添加索引和约束。如果可能,删除现有表并将新表重命名为一个事务中的现有表。

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

https://stackoverflow.com/questions/42187068

复制
相关文章

相似问题

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