sql-server - 提高 SQL Server 2012 的 UPDATE/DELETE 性能
问题描述
我们的项目中有一个过程,其中删除了具有特定标志的表中的记录并更新了剩余记录的标志。
表有大约 4500 万条记录,其中一半的记录带有 flag='C',剩下的一半带有 flag='P'。
进程每天运行一次以删除所有带有“P”标志的记录,然后更新所有带有“C”标志的剩余记录
下面是通过 SSIS 包运行的两个语句。
DELETE FROM dbo.RTL_Valuation WITH (TABLOCK)
WHERE Valuation_Age_Flag = 'P';
UPDATE dbo.RTL_Valuation WITH (TABLOCK)
SET Valuation_Age_Flag = 'P'
WHERE Valuation_Age_Flag = 'C';
目前该过程需要 60 分钟才能完成。有什么办法可以改善处理时间吗?
谢谢
解决方案
您需要一次执行 10000 行。您正在创建一个在事务日志中占用大量空间的巨大事务(因此可以回滚)。
set nocount on
DELETE top (10000) FROM dbo.RTL_Valuation WHERE valuation_Age_Flag = 'P';
while @@rowcount()>0
begin
DELETE top (10000) FROM dbo.RTL_Valuation WHERE valuation_Age_Flag = 'P';
end
您可以尝试 1,000、5,000 或其他一些数字来确定在安装 SQL Server 时从大表中快速删除行的最佳“神奇”数字。但是进行大删除会快得多。相同的逻辑适用于更新。
推荐阅读
- javascript - mern 堆栈:html 正在加载,但反应没有编译
- javascript - 淘汰视图模型返回未定义
- r - 双头滑块输入未获取 R 范围内的所有值
- python - 如何在python中打开一个闭包?
- javascript - 这个作用域在构造函数之后的类中
- server - 是否可以自己免费托管 Realm-Database?
- sql - 如何获取所有查询
- git - 由于 k8s 上 jenkins 上的自签名证书,Git 结帐失败
- python - 如何将共现矩阵转换为networkx图
- python - 在 Python 中如何将 `email.message.Message` 对象转换为 `email.message.EmailMessage` 对象