为什么我会导致群集索引更新?

Jes*_*lam 26 sql sql-server-2005

我正在执行以下声明:

UPDATE TOP(1) dbo.userAccountInfo
SET           Flags = Flags | @AddValue
WHERE         ID = @ID;
Run Code Online (Sandbox Code Playgroud)

列'ID'是具有IDENTITY约束的INT PRIMARY KEY.标志是BIGINT NOT NULL.

执行路径指示正在发生聚簇索引更新.一个非常昂贵的操作.除主键外,没有包含Flags或ID的索引.我觉得实际的执行路径应该是:

聚集索引查找=>更新

Rem*_*anu 30

表有两种形式:聚簇索引和堆.您有一个PRIMARY KEY约束,因此您已隐式创建聚簇索引.你必须去额外的长度表中创建此发生."表"的任何更新都是聚簇索引的更新,因为聚簇索引表.至于聚集索引更新是一个"非常昂贵的操作",现在这是一个城市传说,围绕着关于数据库如何工作的基本错误信息.正确的语句是'影响聚簇键的聚簇索引更新必须更新所有非聚簇索引'.

  • 更新ID需要更新*all*其他索引.更新属于索引的任何其他列将需要更新这些索引.不属于任何索引(作为键或包含列)的列不会导致任何额外更新.例如,如果你有Flags的索引,那么你的更新会发生额外的更新以维护该索引.我不会担心更新,除非我的证据表明一个人不好.大多数情况下,未经优化的读取(扫描)是问题所在.BTW,什么是TOP(1)?ID是PK,不是吗? (5认同)

Bra*_*adC 12

聚簇索引物理表,因此无论何时更新任何行,都要更新聚簇索引.

请参阅此MSDN文章

  • 有什么办法可以避免吗? (2认同)