【发布时间】:2019-01-22 20:22:35
【问题描述】:
我有这个 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
【问题讨论】:
-
请分享'2019-01-19'的执行计划
-
@MuhammadWaheed 整个计划?我无法添加整个计划。太长了。
-
我看到的第一件事是一些图片中的实际行和估计行非常不同。这通常是由于过时的统计数据。您没有提及此表中有多少行,更新频率,特别是最近日期通常会添加新行吗?
-
@MuhammadWaheed 这是计划:brentozar.com/pastetheplan/?id=rkELW1Q7V
标签: sql sql-server query-tuning