索引将SQL查询转得太慢

时间:2016-06-07 20:25:29

标签: sql-server indexing

在我添加索引后,我在SQL查询上遇到了很大的问题。

declare @DateFromCT date, @DateToCT date;
declare @DateFromCT2 date, @DateToCT2 date;
set dateformat dmy;
set @DateFromCT= '1/1/2015'; set @DateToCT= '31/3/2015';
set @DateFromCT2= '1/4/2015'; set @DateToCT2= '30/4/2015';
Select distinct CT.CodCliente,ct.codacesso FROM CT_Contabilidade CT 
Inner join CD_PlanoContas PC ON CT.CodAcesso = PC.Cod
WHERE NOT exists (
    SELECT 1 FROM ct_contabilidade CT2
    WHERE CT2.CodAcesso = CT.CodAcesso 
    and CT2.Data between @DateFromCT2 and @DateToCT2
    And ( CT2.CodEmpresa = 1) And CT2.codcliente = ct.codcliente    )
and CT.Data between @DateFromCT and @DateToCT
AND PC.subgrupo = 'C' 
And ( CT.CodEmpresa = 1 )  And ct.codCliente > 0

CT_Contabilidade的PK是一个Sequential(bigint标识)聚簇索引。 它有150万条记录。

没有其他非聚集索引,它表现良好,花费不到1秒。那对我来说没问题。

我在CodAcesso上创建一个索引以匹配CD_PlanoContas key (cod); CD_PlanoContas PK(聚集索引)是Cod。

它仍然表现良好。没有显着差异......

所以我在codCliente上创建了一个索引(因为它也引用了另一个表)

......在此之后,查询太慢了;这需要7或8分钟。

  • 如果我删除了CodAcesso索引,那就转好了。
  • 如果我放弃CodCliente索引,也可以。
  • 如果我同时让他们两个,但更改查询,使用CD_Planocontas进行内部连接(因此,过滤器“AND PC.subgrupo ='C'”)就可以了。

我无法想象索引会导致查询以这种方式运行。

这是一个巨大的差异,而不仅仅是“性能损失”。我尝试了其他一些东西,因为取出每个过滤器......没有改变。

执行计划建议索引:

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[CT_Contabilidade] ([CodEmpresa],[Data],[CodCliente])
INCLUDE ([CodAcesso])

我创建了它,查询工作正常,即使是其他2个索引(codCliente和codAcesso)

但是我不想为这个查询创建一个特定的索引(它只是使用这些表的许多查询之一)。

如果在没有索引的情况下运行良好,我认为它应该至少与这两个索引一起运行。

导致性能如此剧烈变化的原因是什么?我需要改变什么来加快速度?

2 个答案:

答案 0 :(得分:1)

尝试使用索引优化器提示来控制正在使用的索引。

例如:

选择* 来自标题(索引(tit​​leind)) 其中title ='The Gourmet Microwave'

使用'set statistics io on'命令查看每个查询/索引组合扫描的页数,并使用'rightclick / show execution plan'选项查看查询的执行方式

答案 1 :(得分:0)

遵循执行计划的建议并不总是好主意。

我建议您在添加索引之前和之后比较执行计划并查看差异。也许该索引会导致SQL引擎选择错误的计划。

还尝试更新表和索引的统计信息,看看是否有影响。