У меня возникла огромная проблема в 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
PK CT_Contabilidade представляет собой последовательный (идентификатор bigint), сгруппированный индекс. Имеет 1,5 миллиона записей.
Без других некластеризованных индексов он хорошо работает, занимает менее 1 секунды. Вот нормально для меня.
Я создаю индекс над CodAcesso для соответствия CD_PlanoContas key (cod);
CD_PlanoContas PK (сгруппированный указатель) - это код.
Он по-прежнему хорошо работает. Нет заметная разница ...
Так что я создать индекс над codCliente (так как это относится также другую таблицу)
... И после этого, запрос слишком медленно; он принимает 7 или 8 МИНУТ.
- Если я сброшу индекс CodAcesso, все будет нормально.
- Если я сброшу индекс CodCliente, это тоже нормально.
- Если я позволю им обоим, но изменим запрос, возьмем Inner Join с 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)
Но я не нравится создайте конкретный индекс для этого запроса (это всего лишь один из многих запросов, который использует эти таблицы).
Если он работает без индекса, я думаю, он должен работать как минимум EQUAL с этими двумя индексами.
В чем причина резкого изменения производительности? Что мне нужно изменить, чтобы ускорить процесс?
yeap, SQL Server действительно выбирает плохой план. Я должен подсказать индекс подзапроса (после «EXISTS»), чтобы заставить запрос использовать PK_CT_Contabilidade, а не некластеризованные индексы. – jcosti82