我有以下查询,其中取决于站点名称(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
答案 0 :(得分:3)
由于Where子句中的LIKE语句,我怀疑您的查询需要很长时间。它们的使用方式将阻止使用任何索引。例如,%SER%将阻止使用任何索引。必须进行扫描。而且,当然,我猜你的表中有很多行。
而且,作为一个建议,[aField1喜欢'site2']没有任何意义。没有理由在这里使用LIKE,因为你没有使用任何通配符。
作为一般做法,您应该做的是采取查询,生成估计的查询计划(例如在SSMS中),并在计划中查找扫描。这通常是表现的红旗。