我在这里继承了一个相对简单的查询:
UPDATE tblA
SET tblA.Description =
(SELECT TOP 1 OtherDB.dbo.tblB.Description FROM OtherDB.dbo.tblB WHERE tblA.Code = OtherDB.dbo.tblB.Code)
WHERE tblA.StatusID = 1
tblA中有~140k记录,tblB中有~70k记录。 TblB没有主键,但包含带有描述的代码列表。 tblB.Code上有一个聚集索引,其中包含2个其他列,也不在此查询中。
当我运行此更新时,查询永远不会完成,并且永远不会更新数据。无限期地执行查询旋转。或者可能不是无限期,但我让它运行几分钟并且它没有更新任何记录所以我取消了。 sp_who2将SPID显示为Suspended。
在SSISDB中的执行SQL任务中运行包含此查询的程序包运行15秒,然后以状态6结束(意外结束)。直接在Visual Studio中运行包具有与查询类似的问题,黄色进度" wheel"到达此步骤时无限旋转。
当我从tblA中删除一个索引时,查询在2s以下执行。
索引位于varchar(50)列上,不包括此UPDATE查询。索引中的列不是任何键的一部分。在测试中,我尝试关闭索引的行锁和页锁(以及一些其他选项),查询非结果没有差异。
问题是在两个数据库之间进行比较吗?我从来没有遇到过(我认为的)一个非常简单的更新问题。我觉得我在这里遗漏了一些基本的东西。
为什么删除(看似)无关的索引允许查询运行成功运行?
解决类似问题的最佳解决方法是什么(除了试验和错误,我已经花了一天时间做了)?
编辑:附加信息,删除where子句在几秒钟内使用索引更新所有140k +记录。但索引不在StatusID字段中。