我在添加索引後遇到了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