我在添加索引后遇到了SQL查询中的一个大问题。索引转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个索引相等。
是什么原因导致性能发生如此剧烈的变化?我需要改变以加快速度?
yeap,SQL Server真的选择了一个坏计划。我必须提示索引子查询(在“EXISTS”之后)以强制查询使用PK_CT_Contabilidade,而不是非聚簇索引。 – jcosti82