查询1-UserId是主要标识符,非聚集索引
update myTable set
CurrentHp=MaximumHp,
SelectedAttack1RemainingPP=SelectedAttack1MaximumPP,
SelectedAttack2RemainingPP=SelectedAttack2MaximumPP,
SelectedAttack3RemainingPP=SelectedAttack3MaximumPP,
SelectedAttack4RemainingPP=SelectedAttack4MaximumPP where UserId=1001695
查询2
update myTable set
CurrentHp=MaximumHp,
SelectedAttack1RemainingPP=SelectedAttack1MaximumPP,
SelectedAttack2RemainingPP=SelectedAttack2MaximumPP,
SelectedAttack3RemainingPP=SelectedAttack3MaximumPP,
SelectedAttack4RemainingPP=SelectedAttack4MaximumPP
where UserId=1001695
and
(
SelectedAttack1RemainingPP!=SelectedAttack1MaximumPP
or
SelectedAttack2RemainingPP!=SelectedAttack2MaximumPP
or
SelectedAttack3RemainingPP!=SelectedAttack3MaximumPP
or
SelectedAttack4RemainingPP!=SelectedAttack4MaximumPP
or
CurrentHp!=MaximumHp
)
当我通过SQL Server Management Studio检查并比较“包括实际执行计划”时,它们的成本是相同的
但是,当我通过“包括客户统计信息”进行检查时,我看到第一个查询显示了1900行更新,而第二个查询显示了0行更新
所以这是我的问题,当A列和B列的值相等时,SQL是否仍进行更新?
我也逻辑上认为两个查询应该相同,但我想听听您的意见
执行计划具有相同的效果图片
客户统计信息查询1
客户统计信息查询2
答案 0 :(得分:0)
两个执行计划是相同的,因为您的第一个过滤条件(UserId = 1001695)仅选择一行,并且该表在该字段上具有索引。 如果您将查询更改为范围条件(例如(userID> 100)),则执行计划中的成本发生了变化,并且不相同,或者如果您的过滤器位于该表没有索引的另一个字段中,则结构执行计划已更改,并且不相同。