2009-05-22 53 views
25

我执行以下语句:为什么我会导致群集索引更新?

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

列 'ID' 是一个INT PRIMARY KEY与IDENTITY约束。 标志是一个BIGINT不为NULL。

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

聚集索引查找=>更新

+0

你一定确定该索引既不聚集也不覆盖该领域[标志]? – 2009-05-22 00:06:53

+0

查询中的TOP(1)是什么? – BradC 2009-05-22 00:10:37

+0

@未知Google: 此表上只有一个非聚集idx。它既不影响ID也不影响标志。 @ BradC: 在我的发言中有点冗长。 “这个陈述只会影响一个用户。”但真的没有任何目的。 – Kivin 2009-05-22 00:15:06

回答

27

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

10

聚集索引物理表,所以每当你更新任何行,您要更新集群指数。

this MSDN article

相关问题