我有这个SQL查询,但是我发现它最多可能需要11秒钟才能运行。我真的很困惑,因为当我将日期选择更改为2018年时,它会立即返回。
以下是查询:
select
cv.table3ID, dm.Column1 ,dm.Column2, mm.Column1,
convert(varchar, cv.Date, 107) as Date,
mm.table2ID, dm.table1ID, mm.Column2,
count(ctt.table4ID) as Total
from
table1 dm
inner join
table2 mm on mm.table2ID = dm.table1ID
inner join
table3 cv on cv.table3ID = mm.table2ID
left join
table4 ct on ct.table4CVID = cv.table3ID
inner join
table4 ctt on ctt.table4MMID = mm.table2ID
where
ctt.table4Date >= '2019-01-19'
and ct.table4CVID is null
and dm.Column1 like '%Albert%'
and cv.Column1 = 39505
and cv.Status = 'A'
group by
cv.table3ID, dm.Column1 ,dm.Column2, mm.Column1,
cv.Date, mm.table2ID, dm.table1ID, mm.Column2
我发现当我使用ctt.table4Date> ='2018-01-19'执行该查询时,响应是立即的。但是使用'2019-01-19'则需要11秒。
最初,当我发现查询花了11秒钟时,我以为它必须是索引问题,但是我不确定它是否与索引有关,因为它在较旧的日期执行得很好。
我查看了日期不同的查询的执行计划,它们看起来完全不同。
对为什么会发生这种情况有任何想法吗?与更新统计信息有关吗?
[更新]
下图是table4 ctt在2018年和2019年之间执行计划的比较。根据执行计划,这将占2018年运营商成本的43%和2019年占45%。 Execution Plan comparison of table4 ctt 2019 and 2018. Top is 2019, bottom is 208
这里的图像再次是对table4作为ct的执行计划的比较。同样,顶部是2019,底部是2018。 Execution plan of table4 ct comparison 2019 and 2018. Top is 2019, bottom is 208
[更新2]
以下是SQL执行计划:
使用“ 2018-01-19”作为日期时:https://www.brentozar.com/pastetheplan/?id=SyUh8xXQV
使用“ 2019-01-19”作为日期时:https://www.brentozar.com/pastetheplan/?id=rkELW1Q7V