我有一个包含9亿条记录的数据库表。在这种情况下,我需要更新该表中的4个不同的键,方法是将它们连接到一个维度,并将事实表的键设置为该维的键。我已经写了4个不同的SQL脚本(见下面的例子)来执行更新,但问题是它执行的时间太长了。查询已经运行了20多个小时,我甚至不确定它会走多远,需要多长时间。有没有什么办法可以改进这一点,这样只需要几个小时就能完成。添加索引会改善这一点吗?
UPDATE f
SET f.ClientKey = c.ClientKey
FROM dbo.FactSales f
JOIN dbo.DimClient c
ON f.ClientId = c.ClientId发布于 2017-02-12 20:00:27
和注释5-仅使用所有新的源代码从目标表中准备主键,并执行一条语句。这意味着join的成本更低,而且它将只有一个join。
发布于 2017-02-12 20:57:24
可以使用它来不填满事务日志
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
发布于 2017-02-14 14:36:21
使用正确的值创建一个新表。之后添加索引和约束。如果可能,删除现有表并将新表重命名为一个事务中的现有表。
https://stackoverflow.com/questions/42187068
复制相似问题