我有一个旧的数据库使用char(1)
与'T'
和'F'
布尔值。该字段中的唯一值是T
and F
,在以下查询中,第一个是瞬时的,第二个需要 30 秒。
select top 50 * from vw_Movement
where MOVTypeId = 20 and MOVRequiresResolution = 'T' and MOVIsResolved = 'F'
select top 50 * from vw_Movement
where MOVTypeId = 20 and MOVRequiresResolution = 'T' and MOVIsResolved = 'T'
Run Code Online (Sandbox Code Playgroud)
执行计划非常相似,但较慢的使用不同的索引。
我修正通过改变SQL的问题:
select top 50 * from vw_Movement
where MOVTypeId = 20 and MOVRequiresResolution = 'T' and MOVIsResolved <> 'F'
Run Code Online (Sandbox Code Playgroud)
这使数据库使用与第一个查询相同的索引并立即执行,但我更愿意了解实际发生的情况。我在阅读执行计划方面非常绿色,但是对于可能发生的事情的一些指示将不胜感激。
从阅读周围,似乎中符合条件的会影响性能记录的预期数量,所涉及的表有更多的F
比T
:
movisresolved
------------- ----------- …
Run Code Online (Sandbox Code Playgroud)