这两个查询之间是否有性能差异?

时间:2019-02-07 11:42:14

标签: sql-server tsql sql-server-2017 sqlperformance

查询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是否仍进行更新?

我也逻辑上认为两个查询应该相同,但我想听听您的意见

执行计划具有相同的效果图片

enter image description here

客户统计信息查询1

enter image description here

客户统计信息查询2

enter image description here

1 个答案:

答案 0 :(得分:0)

两个执行计划是相同的,因为您的第一个过滤条件(UserId = 1001695)仅选择一行,并且该表在该字段上具有索引。 如果您将查询更改为范围条件(例如(userID> 100)),则执行计划中的成本发生了变化,并且不相同,或者如果您的过滤器位于该表没有索引的另一个字段中,则结构执行计划已更改,并且不相同。