我正在分析在Amazon RDS上运行的SQL Server 2017探查器中的一些查询,并且遇到了一些意想不到的性能结果。
这两个查询返回相同的结果,我希望第一个查询更快,因为它仅限于一个LIKE。但事实上,第二个查询一直更快(查询1平均为350毫秒,查询2平均为300毫秒)。
我很好奇是否有人可以解释为什么查询2比查询1更快?
查询1 (Query Plan)
select * from Vehicles
where vehicle like '%02%toyota%camry%'
查询2 (Query Plan)
select * from Vehicles
where vehicle like '%02%' and vehicle like '%toyota%' and vehicle like '%camry%'
Vehicles表有500K行。 vehicle
字段是索引varchar(300)
,这是一些匹配行的示例:
2002 Toyota Camry LE 2.4L (2AZFE) 4-spd (U140E)
2002 Toyota Camry LE 2.4L (2AZFE) 4-spd (U140E)
2002 Toyota Camry LE 2.4L (2AZFE) 4-spd (U241E)
2002 Toyota Camry LE 2.4L (2AZFE) 4-spd (U241E)
2002 Toyota Camry LE 2.4L (2AZFE) 5-spd (E351)
2002 Toyota Camry LE 2.4L (2AZFE) 5-spd (E351)
当打开Statistics IO时,两者的输出相同:
Scan count 1, logical reads 4175, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0
答案 0 :(得分:0)
我的查询可以使用通配符是第一个字符的索引,这对我没有意义。它不会知道B树上的行踪开始。它必须考虑表中的每一辆车,看它是否匹配。
一些可能性:
答案 1 :(得分:0)
至少有两种想法可能导致这种情况。
此外,我会在运行缓存之前释放缓存以防止使用缓存计划。