SQL Update语句遍历全表致执行过慢问题排查求助
SQL UPDATE语句执行过慢的问题分析与修复
你的UPDATE语句执行缓慢的核心原因确实是没有引用FROM子句中的表别名,导致数据库执行计划偏离预期,被迫扫描整张MasterTable。
原问题代码
Update MasterTable set FieldtoUpdate = b.TempFieldValue from MasterTable a join TempTable b on A.Pkey = b.Pkey
问题原因
这里UPDATE后面直接指定MasterTable作为目标表,但FROM子句里给该表起了别名a。数据库无法将这两个引用正确关联,会把UPDATE的目标表和FROM里的a视为两个独立的数据集,先做笛卡尔积关联,再过滤匹配Pkey的行。这就意味着数据库会遍历MasterTable的每一行,再判断是否匹配TempTable,哪怕只有20行需要更新,也会执行全表扫描的冗余操作,最终导致执行时间长达数小时。
修复后的代码
Update a set FieldtoUpdate = b.TempFieldValue from MasterTable a join TempTable b on a.Pkey = b.Pkey
修复说明
将UPDATE的目标表改为FROM子句中定义的别名a后,数据库能明确识别出要更新的是MasterTable与TempTable关联后的匹配行,只会处理这部分符合条件的数据,不会再做全表遍历,执行效率会立刻回到预期水平。
内容的提问来源于stack exchange,提问作者user27360043
相关产品推荐
相关产品推荐

