代码之家  ›  专栏  ›  技术社区  ›  Jesse Hallam

为什么我要引起聚集索引更新?

  •  26
  • Jesse Hallam  · 技术社区  · 17 年前

    我正在执行以下语句:

    UPDATE TOP(1) dbo.userAccountInfo
    SET           Flags = Flags | @AddValue
    WHERE         ID = @ID;
    

    列“id”是带有标识约束的int主键。 Flags是一个bigint,不为空。

    执行路径指示正在进行聚集索引更新。非常昂贵的手术。 除了主键之外,没有包含标志或ID的索引。 我觉得实际的执行路径应该是:

    聚集索引查找=>更新

    2 回复  |  直到 10 年前
        1
  •  27
  •   Remus Rusanu    17 年前

    表有两种类型:聚集索引和堆。您有一个主键约束,所以您已经隐式地创建了一个聚集索引。在为这个创建表的过程中,您必须额外增加长度。 发生。“table”的任何更新都是聚集索引的更新,因为聚集索引 桌子。 至于聚集索引更新是一个“非常昂贵的操作”,现在这是一个关于数据库如何工作的基本错误信息的城市传说。正确的语句是“影响聚集键的聚集索引更新必须更新所有非聚集索引”。

        2
  •  11
  •   BradC    17 年前

    聚集索引 物理表,因此每当您更新 任何 行,您正在更新聚集索引。

    this MSDN article

    推荐文章