Sql server 为什么在更新未包含在该索引(Ms SQL)中的字段时更新聚集索引?

Sql server 为什么在更新未包含在该索引(Ms SQL)中的字段时更新聚集索引?,sql-server,tsql,indexing,clustered-index,Sql Server,Tsql,Indexing,Clustered Index,我们正在使用MS SQL Server 2005 您好,我正在数据库表上执行UPDATE语句。假设此表有下一列: int Id PK int Column1 int Column2 它还有几个索引: Unique Clustered (Id) Non-Unique Non-Clustered (Column1) Non-Unique Non-Clustered (Column2) 我做下一个操作: UPDATE [dbo].[Table] SET Column1 = @Valu

我们正在使用MS SQL Server 2005

您好,我正在数据库表上执行UPDATE语句。假设此表有下一列:

int Id PK
int Column1
int Column2
它还有几个索引:

Unique Clustered (Id)
Non-Unique Non-Clustered (Column1)
Non-Unique Non-Clustered (Column2)
我做下一个操作:

 UPDATE  [dbo].[Table] 
    SET Column1 = @Value1
    WHERE Column1 = @Param1
      AND Column2 = @Param2
之后的实际执行计划如下所示:

这意味着86%的时间用于更新聚集索引,其中不包括我刚刚更改的列

此操作应在禁用web应用程序的情况下运行数十万次,这意味着它非常耗时

那么,有没有人知道为什么事情会这样发展,以及它是否能够以某种方式得到修复?这个问题有意义吗?如果需要,我准备提供更多信息。

聚集索引是实际的表。表的所有列都在“聚集索引”中(LOB的“行外”存储除外,等等)

更改列的值时,必须在表页以及该列出现的任何索引中进行更改

就快速定位要更新的行(针对您的特定查询)的性能而言,
dbo.Table(Column1,Column2)
dbo.Table(Column2,Column1)
上的索引将是最合适的


如果正在修改的列可能已经分配了值(即@Param1和@value都表示相同的值),那么添加另一个谓词可以通过避免在行上获得锁来提高性能

UPDATE [dbo].[Table]
   SET Column1 = @Value1
 WHERE Column1 = @Param1
   AND Column2 = @Param2
   AND Column1 <> @Value1
UPDATE[dbo].[表]
SET Column1=@Value1
其中Column1=@Param1
和Column2=@Param2
和第1列@Value1

聚集索引存储每一行的所有数据。此外,显示的运算符包括2个索引更新。查看属性。添加和Column1@Value1的条件。获取锁是昂贵的部分。