SQL存储过程替代游标的性能优化方法
时间:2026-08-21 | 作者:冻月看渠 | 阅读:0在进行数据库操作时,建议优先考虑使用UPDATE FROM或JOIN来进行批量更新,以此替代游标操作。
原因很直接:游标逐行更新时,处理10万行数据,需要进行10万次的B-Tree查找、加锁以及日志刷盘操作;而采用集合操作,通过一次哈希连接就能完成相同任务。
对于MySQL数据库,需要将语法调整为UPDATE JOIN。如果遇到复杂逻辑,可以先将数据物化到#updates表中。需要注意的是,MERGE操作在高并发情况下容易出现死锁问题,相比之下,UPDATE FROM的稳定性更高。
UPDATE FROM 一次性更新替代游标逐行 UPDATE
游标里写 UPDATE t SET status = 'done' WHERE id = @id,本质上是让数据库为每一行重复做主键查找、加锁、写日志。
10万行就是10万次B-Tree定位 + 10万次事务日志刷盘。
更合适的方式,是直接改用集合操作:
UPDATE o SET status = 'processed' FROM orders o INNER JOIN #updates u ON o.id = u.order_id;
#updates必须提前物化好(SELECT id INTO #updates FROM ...),别在JOIN里嵌套子查询或函数调用- MySQL 不支持
UPDATE ... FROM,得写成UPDATE t JOIN s ON ... SET t.col = s.val MERGE虽然语义清晰,但在高并发下容易死锁,UPDATE FROM更稳- 如果更新逻辑依赖计算(比如
dbo.calc_score(@id)),先算好存进#updates,别让它在JOIN中反复执行
CTE + ROW_NUMBER() 分批处理替代顺序游标
这种方式适合必须按时间或ID顺序推进、又不能全量更新的场景。
例如:分阶段状态流转、日志归档。
WITH batch AS ( SELECT id, created_time, ROW_NUMBER() OVER (ORDER BY created_time) AS rn FROM orders WHERE status = 'pending' ) SELECT * FROM batch WHERE rn BETWEEN @start AND @end;
ORDER BY字段必须有索引,否则ROW_NUMBER()会强制排序,内存暴涨甚至溢出到tempdb- 别用
NEWID()排序——破坏索引利用,结果不可复现,批次不一致 - 分片大小建议 5000–10000 行:小于 5000 循环次数多;大于 10000 容易触发
LOG FULL或锁升级成表锁
WHILE + 临时表模拟可控逐行处理
只有当业务逻辑无法塞进单条SQL时才使用这种方式。
比如要调外部存储过程、写审计日志、控制每秒处理数,或依赖上一行结果。
SELECT id INTO #work_ids FROM orders WHERE status = 'pending'; SET XACT_ABORT ON; WHILE EXISTS (SELECT 1 FROM #work_ids) BEGIN DECLARE @id INT = (SELECT TOP 1 id FROM #work_ids); -- 处理单行逻辑 EXEC do_something @id; DELETE FROM #work_ids WHERE id = @id; END
- 第一步只查一次原表,把主键集提取进
#work_ids,避免每次循环都扫描原表 - 用
TOP 1或MIN(id)驱动,别用游标式FETCH NEXT - 每次处理完立刻
DELETE对应行,防止重跑或漏跑 SET XACT_ABORT ON是硬性要求,否则某次失败会导致后续循环卡住或数据残留
真正难的是判断“该不该逐行”
很多人不是不会写 WHILE,而是没想清楚:当前逻辑是否真的需要逐行?有没有隐藏的集合表达可能?
比如状态机推进看似要顺序处理,但有时用 CASE WHEN + 窗口函数,就能一次算出终态。
游标不是语法错误,而是设计信号。它提示你:这段逻辑可能没被数据库引擎友好接纳。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 迅捷路由器怎么调信号最强,设置时要注意什么?
- 时间:2026-08-27
-
- vivo浏览器怎么卸不掉?原因和解决方法在这里
- 时间:2026-08-27
-
- OPPO R11s黑屏了,怎么强制恢复出厂设置?
- 时间:2026-08-27
-
- 飞利浦显示器包装盒有生产日期和保修期吗?怎么看?
- 时间:2026-08-27
-
- 联想新平板开机必须联网吗?怎么做?
- 时间:2026-08-27
-
- 平板横竖屏切换设置与问题解决
- 时间:2026-08-27
-
- 移动电源容量怎么测?要准备哪些工具?
- 时间:2026-08-27
-
- 荣耀90 Pro防水吗?防水级别多少?怎么用才安全
- 时间:2026-08-27
精选合集
更多大家都在玩
大家都在看
更多-
- 2026年9月17日小鸡庄园答案
- 时间:2026-09-16
-
- 蚂蚁庄园今日答案2026年9月17日
- 时间:2026-09-16
-
- 蚂蚁庄园小课堂今日最新答案2026年9月17日
- 时间:2026-09-16
-
- 蚂蚁庄园小鸡答题今日答案2026年9月17日
- 时间:2026-09-16
-
- 褪黑素主要由人体哪个器官分泌 蚂蚁庄园今日答案9.17
- 时间:2026-09-16
-
- 蚂蚁庄园今天答题答案2026年9月17日
- 时间:2026-09-16
-
- 蚂蚁庄园答题今日答案2026年9月17日
- 时间:2026-09-16
-
- 研学旅游指导师的核心服务对象是 蚂蚁新村今日答案2026.9.16
- 时间:2026-09-16
