繁体   English   中英

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

[英]SQL - Update query performance for large table (900 million) records

我有一个拥有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
  1. 脚本外键。 放下
  2. 更新列上的脚本索引(不属于条件)。 放下
  3. 禁用触发器(如果存在)。
  4. 禁用所有可以进行锁定的进程(= all,包括selects)。
  5. 更新密钥。
  6. 重新创建您的外键,索引,启用触发器。
  7. 要开心。

并注释5-仅使用所有新的源代码从目标表中准备主键,并执行一条语句。 这意味着较少的连接成本,并且只有一个连接。

可以用它来不填写交易日志

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

用正确的值创建一个新表。 然后添加索引和约束。 删除现有表并将新表重命名为现有的一对一事务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM