Sql server 为什么我的观点';当它引用的基础数据不';你不会变吗?

Sql server 为什么我的观点';当它引用的基础数据不';你不会变吗?,sql-server,query-optimization,Sql Server,Query Optimization,然后单击左下角的“执行计划”链接查看上下文 如您所见,CountryGroup表有一行CountryId=1。然后,我用一条语句更新CountryGroup表,该语句实际上应该是no-op(当CountryId=1时设置CountryId=1)。这会触发在视图上重建聚集索引UX\u CountryGroupView\u Id,这是一个相对昂贵的操作(查询成本的60%)。在我实际使用的数据库中,实际成本要高得多,因此出现了这个问题 SQL Server在确定是否应该更新索引时是否只检查@@rowc

然后单击左下角的“执行计划”链接查看上下文

如您所见,
CountryGroup
表有一行
CountryId=1
。然后,我用一条语句更新
CountryGroup
表,该语句实际上应该是no-op(当CountryId=1时设置
CountryId=1
)。这会触发在视图上重建聚集索引
UX\u CountryGroupView\u Id
,这是一个相对昂贵的操作(查询成本的60%)。在我实际使用的数据库中,实际成本要高得多,因此出现了这个问题

SQL Server在确定是否应该更新索引时是否只检查
@@rowcount
,或者是否/是否可以查看数据以查看是否已更改以及是否应该花费重建的精力?似乎是前者,但是否可以指定后者的行为,或者控制SQL Server在这种情况下的行为


请注意,我无法控制正在自动生成的SQL
update
语句。

这将是一个非常“狭窄”的应用优化的地方-到目前为止,绝大多数更新都需要一些索引维护。优化的是,系统不必重建整个索引-索引视图存在各种限制,因此维护成本尽可能低。目前尚不清楚此更新是否会导致运行时成本增加60%。而且,从物理上讲,它可能不会更新任何内容。对于普通索引,它没有(查看t-log)。但它需要处理该行以某种方式锁定。@在我的现实场景中,对于包含实际数据的实际表,
update
在排除
CountryId
列的情况下需要不到一秒钟的时间,而包含该列的时间则超过一分钟。所以60%的人实际上是保守派。但不管怎样,我的问题不是时间问题,而是如何尽可能避免昂贵的副作用。
CountryId 1在哪里起作用?
排除CountryId列是什么意思?在您的示例更新中,这就是您影响的全部内容,因此无法排除它。