如何改进“有和”查询

时间:2014-12-03 17:15:19

标签: sql-server performance sql-server-2008

我有这个问题:

 Select 
     DescFornecedor, DescUsuario, Classificacao,
     Sum(Tempo) as Tempo,   
     Case Classificacao  
        When 'Agendamento' Then 2  
        When 'Aguardando cadastro' Then 3  
        When 'Descarte' Then 8  
        When 'Desistência' Then 7  
        When 'Em Pausa' Then 4  
        When 'Em Volta' Then 10  
        When 'Entrevista' Then 1  
        When 'Filtro' Then 5  
        When 'Outros' Then 9  
        When 'Recusa' Then 6  
        When 'Sem Atividade' Then 11  
    End as Ordem   
from 
   vwProducaoGeralTempoLogadoSemAtividade t1 With(NoLock)  
Where 
   Not Exists (Select 0 
               from vwProducaoGeralTempoLogadoSemAtividade t2 With(NoLock)  
               Where T1.CodUsuario = t2.CodUsuario    
               Group by CodUsuario  
               Having Sum(tempo) <> MAx(tempoLogado))  
Group By 
    DescFornecedor, DescUsuario, Classificacao 

当我们使用它时,它会在30~1分钟内返回结果。

现在我做了一些调整:

Select DescFornecedor,DescUsuario,Classificacao,Sum(t1.Tempo) as Tempo,   
   Case Classificacao  
 When 'Agendamento' Then 2  
 When 'Aguardando cadastro' Then 3  
 When 'Descarte' Then 8  
 When 'Desistência' Then 7  
 When 'Em Pausa' Then 4  
 When 'Em Volta' Then 10  
 When 'Entrevista' Then 1  
 When 'Filtro' Then 5  
 When 'Outros' Then 9  
 When 'Recusa' Then 6  
 When 'Sem Atividade' Then 11  
  End as Ordem   
  from vwProducaoGeralTempoLogadoSemAtividade t1 With(NoLock)  
    inner join (   

select  CodUsuario, SUM(tempo) as Tempo, MAX(tempologado) as TempoLogado   
from  vwProducaoGeralTempoLogadoSemAtividade with(nolock)      
group by CodUsuario  

 ) t2  
   on   t1.CodUsuario = t2.CodUsuario and  
  t2.Tempo = t2.TempoLogado      
  Group By DescFornecedor,DescUsuario,Classificacao

但我很慢!持续10~20秒。

如何改进此查询? 我没有想法。

不知道如何处理时间比较。

非常感谢。

(索引和统计数据还可以,甚至跟踪都不能帮助我)

2 个答案:

答案 0 :(得分:0)

如果第二个查询中没有拼写错误,我对此部分有疑问:

...on ... and t2.Tempo = t2.TempoLogado

第二个标准仅基于t2,因此可以从连接标准中删除并在t2内处理,方法是添加:

...having SUM(tempo) = MAX(tempologado)
但是,我不确定它是否会有很大改进。

UPDATE:由于CodUsuario是视图中的计算列,因此解决方案是将视图更改为索引视图,然后创建索引。

create index CodUsuario on vwProducaoGeralTempoLogadoSemAtividade(CodUsuario)

答案 1 :(得分:0)

尝试cross apply

cross apply (   

select  CodUsuario, SUM(tempo) as Tempo, MAX(tempologado) as TempoLogado   
from  vwProducaoGeralTempoLogadoSemAtividade with(nolock)      
group by CodUsuario  

 ) t2  
   where  t1.CodUsuario = t2.CodUsuario and  
  t2.Tempo = t2.TempoLogado      
  Group By DescFornecedor,DescUsuario,Classificacao