MSSQL 2008R2:幻影索引更新

MSSQL 2008R2:幻影索引更新

我试图运行以下查询:

    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

您是否有也引用这些表的索引视图?对这些表的更新也会导致对索引视图的索引更新。

相关内容