查询需要很长时间才能完成

时间:2014-07-22 15:40:12

标签: sql sql-server tsql

我有以下查询,其中取决于站点名称(afield1)值,不同的列用于获取PatrolNo信息。查询从视图中从星期日开始获取当前周的数据,然后为每个站点构建计数。

但返回值需要花费大量时间。

select cast(temp.timetag1 as date) as Date, temp.PatrolNo,temp.ScansDue, COUNT(*) as Total,temp.aField1
from (select timetag1, afield1 ,
case when afield1 = 'site1' then afield17
when afield1 = 'site2' then afield16
when afield1 = 'site3' then afield18
when afield1 = 'site4' then afield19
when afield1 = 'site5' then afield20
when afield1 = 'site6' then afield21
when afield1 = 'site7' then afield22 end as PatrolNo,
case when afield1 = 'site1' then 17
when afield1 = 'site2' then 8
when afield1 = 'site3' then 9
when afield1 = 'site4' then 32
when afield1 = 'site5' then 15
when afield1 = 'site6' then 15
when afield1 = 'site7' then 52 end as ScansDue
FROM         someview
where timetag1 >= (dateadd(dd,(datediff(dd,-53690,getdate()-1)/7)*7,-53690))  and timetag1 < GETDATE()
and aField1 like 'site2'
and (afield3 like '%SER%' OR afield10 like '%SER%' OR afield11 like '%SER%' OR afield12 like '%SER%' OR afield13 like '%SER%' 
OR afield14 like '%SER%' OR afield15 like '%SER%')
    ) temp
group by cast(temp.timetag1 as date),aField1, PatrolNo,ScansDue;

date            PatrolNo    ScansDue  Total    aField1
2014-07-21      1           32        63       site1
2014-07-21      2           32        63       site2
2014-07-21      3           32        32       site1
2014-07-21      4           32        31       site7
2014-07-21      5           32        30       site7 

1 个答案:

答案 0 :(得分:3)

由于Where子句中的LIKE语句,我怀疑您的查询需要很长时间。它们的使用方式将阻止使用任何索引。例如,%SER%将阻止使用任何索引。必须进行扫描。而且,当然,我猜你的表中有很多行。

而且,作为一个建议,[aField1喜欢'site2']没有任何意义。没有理由在这里使用LIKE,因为你没有使用任何通配符。

作为一般做法,您应该做的是采取查询,生成估计的查询计划(例如在SSMS中),并在计划中查找扫描。这通常是表现的红旗。