sql - SQL Server - 优化 UPDATE 语句的执行
问题描述
我正在尝试对 12 列和大约 500 万条记录的表运行以下查询:
UPDATE dbo.Capture
SET STATUS = 501,
BATCH = NULL
WHERE STATUS = 1
其中的记录数STATUS = 1
约为 400 万条记录。在我最终取消它之前,查询运行了一个小时,因为:
- 一个小时过去了,这对于我们的 SQL 数据库运行 UPDATE 查询来说是非常不正常的时间长度。
- 我们有一个与该数据库交互的 Service Fabric 应用程序,在该查询运行大约 10 分钟后,我们开始收到来自 Service Fabric 集群的运行状况错误,这似乎是由于该查询锁定了数据库。
我的问题是是否有更有效的方法来更新这 400 万条记录。我是否应该尝试批量更新,如果是,如何在查询中完成?
我有一个自动索引分解器,它每 24 小时运行一次,因此索引的碎片应该不会导致任何问题。
解决方案
鉴于您要更新大约 80% 的行,分解它可能是最简单的方法。这是一种方法(假设 Capture 具有名为 ID 的主键列):
WHILE EXISTS (SELECT * FROM Capture WHERE Status=1) BEGIN
UPDATE c1
SET STATUS = 501,
BATCH = NULL
FROM Capture c1
JOIN (SELECT TOP 10000 ID FROM Capture WHERE STATUS = 1) c2 ON c1.ID = c2.ID
END
推荐阅读
- python - 如何从python脚本运行和保存scrapy状态
- android - react native 中的 android 无障碍服务
- documentum - 文档错误:[DM_STORAGE_E_NOT_ACCESSIBLE]
- python - 在python中捕获ssh密码提示
- laravel-5 - 如何编辑 laravel 地平线视图
- c# - 视口参数键“缩小以适应”无法识别和忽略。在 Safari 浏览器中
- .net - 在 IIS 中禁用应用程序池的自动启动
- python - 使用 tensorflow 的损失不会低于 ~60 并且测试准确率永远不会高于 ~40%
- google-apps-script - 将内容从可变单元格复制到另一张纸上的固定单元格,然后超链接到固定单元格
- javascript - 如何撤消 navigator.storage.persist(() => {})