Sql server 如何改进“有和”查询

Sql server 如何改进“有和”查询,sql-server,performance,sql-server-2008,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 'De

我有一个疑问:

 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 
但我还是很慢!持续10~20秒

如何改进此查询? 我没有主意了

不知道该怎么处理时间比较

多谢各位


索引和统计数据都正常,现在连跟踪都帮不了我了

如果第二个查询中没有输入错误,我对这部分有问题:

...on ... and t2.Tempo = t2.TempoLogado
第二个条件仅基于t2,因此可以从联接条件中删除,并在t2内部处理,方法是添加:

...having SUM(tempo) = MAX(tempologado)
不过,我不确定它是否有多大改进

更新:因为CodUsuario是视图中的一个计算列,所以解决方案是将视图更改为索引视图,然后创建索引

create index CodUsuario on vwProducaoGeralTempoLogadoSemAtividade(CodUsuario)
试一试


您使用的是哪个版本的sql server?表中的行数是多少?您是否有Codusario索引?我还猜测,通过命名,VWproducageorTempologadosematividade是一种观点。它是基于单个表还是其中有一些联接?在VWProducageorTempologaDosematividade视图中,我有3583行4秒来显示结果。Codusario不是数据库中表上的一列,我们将它与视图一起使用。我可以在视图的列上添加索引吗?这是索引视图吗?vwPercentualProducao仅返回11行。我使用的是SQL2008R20,你肯定应该在Codusario上创建一个索引,这就是问题所在。3583行非常小,如果创建索引,查询将以毫秒为单位执行!多谢各位。我在这里看到,要创建索引视图,我需要使用2部分名称,比如dbo.view。但是这个视图调用了另一个视图,我也需要schemabind这个视图,但是这个视图调用了另一个视图…它是无止境的!我想这对我有帮助。我遇到以下错误:无法在视图“vwProducalTempologaDoseMatividade”上创建索引,因为该视图未绑定架构。它说我需要使用SCHEMABINDING创建视图。我会和编码员谈谈,看看他是否能帮我:非常感谢。我在表的视图上创建了一个索引,它成功了。
create index CodUsuario on vwProducaoGeralTempoLogadoSemAtividade(CodUsuario)
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