gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:03:17 26 4
gpt4 key购买 nike

我们使用的是 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

之后的实际执行计划如下所示:Execution plan

这表示 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

关于sql-server - 为什么聚集索引会在更新未包含在该索引中的字段时更新(Ms SQL)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18019780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com