我试图运行以下查询:
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 分钟,并阻止了许多其他表的多个其他用户。
我检查了查询计划,此查询至少更新了 12 个索引。我知道旧数据库的索引过多。这不是我现在的问题。
我的问题是:正在更新的 7 个索引(以及成本最高的 3 个索引)不是来自表 A 或表 B。我检查了表上的所有触发器,它们都不会对正在更新的另外两个表产生任何影响。
这是怎么发生的?有什么机制可能导致这些幻影更新?
答案1
没关系,我发现了这个问题。对另一个表的外键列进行了更新。由于正在更新外键,因此必须更新外键引用的行,从而导致受影响表上的索引更新。
答案2
您是否有也引用这些表的索引视图?对这些表的更新也会导致对索引视图的索引更新。