我试图运行以下查询:
Update A SET A.Col1 = B.Col1, ... A.ColN = B.ColN FROM A INNER JOIN B ON (A.Col1 = B.Col1) WHERE B.Col2 = X AND (A.Col1 <> B.Col1 OR ... OR A.ColN <> B.ColN)
该查询在其更新中仅影响4700行(和7列)。 但是它需要花费10多分钟,并阻止来自其他许多表的多个其他用户。
我检查了查询计划,并且不less于12个索引因此查询而更新。 我知道遗留数据库是overindexed。 这不是我现在的问题。
我的问题是这样的:被更新的索引中的7个(以及3个最昂贵的索引)不是来自表A或表B.我已经检查了表上的所有触发器,并且它们中没有一个导致对另外两个表正在更新。
这怎么可能发生? 有什么机制可以导致这些幻影更新?
没关系,我发现了这个问题。 有一个列的更新是另一个表的外键。 由于外键正在更新,外键引用的行必须更新,导致受影响的表上的索引更新。
你有索引的观点,也引用这些表? 对这些表的更新还会导致索引视图的索引更新。