具有相同执行计划的查询具有显着的执行时间差异

时间:2018-02-14 10:23:53

标签: sql-server sql-execution-plan

我在同一个事实表上有两个查询,它们提供两个表,一个具有每日粒度,另一个具有每小时粒度。

select 
    t1.date
    ,sum(t1.col1) as col1
    ...
    ,t1.coln
    ,t2.col1
    ,t3.col1
from table1 t1
left join table2 t2
on t1.id = t2.id
left join table3 t3
on t1.id = t3.id
where 
t1.date between '20180210' and '20180211'
group by t1.date
         ,t1.col1
         ....
         ,t1.coln
         ,t2.col1
         ,t3.col1


select 
    t1.date
    ,datepart(hh,t1.datetime) as hour
    ,sum(t1.col1) as col1
    ...
    ,t1.coln
    ,t2.col1
    ,t3.col1
from table1 t1
left join table2 t2
on t1.id = t2.id
left join table3 t3
on t1.id = t3.id
where 
t1.date between '20180210' and '20180211'
and t1.cola = 'value1'
and t2.colb in ('value2','value3')
group by t1.date
         ,datepart(hh,t1.datetime) 
         ,t1.col1
         ....
         ,t1.coln
         ,t2.col1
         ,t3.col1

这些列是通用的,但其他所有内容都与我的生产查询完全相同。查询计划涉及表1中的一个表扫描,这是成本的96%。 这些查询计划在凌晨(早上5点)运行,并且对于每日数据(查询必须处理大约200,000行table1,这是事实表)执行时间为每天约1分钟,每小时约1.5分钟数据

在我的SSIS作业失败的极少数情况下,如果我尝试重新运行每小时查询,根据sp_who2和服务器监视,它需要极高的CPU时间,消耗所有服务器的cpu(使用率高达99-100 %)和查询永远不会运行。如果我不更新数据并让SSIS作业在第二天运行并加载前两天,那么一切都会顺利进行。 我不明白为什么添加datepart()函数会导致性能下降,其中两个计划的计划和估计的cpu和I / O成本完全相同。

我应该搜索什么想法?

0 个答案:

没有答案