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