5

我们使用的是 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 应用程序的情况下运行数十万次,这意味着它非常关键。

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

4

1 回答 1

5

“聚集索引”是实际的表。表的所​​有列都在“聚集索引”中(对于 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
于 2013-08-02T14:45:49.107 回答