2016-06-07 2 views
0

У меня возникла огромная проблема в 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 с этими двумя индексами.

В чем причина резкого изменения производительности? Что мне нужно изменить, чтобы ускорить процесс?

ответ

0

Не всегда рекомендуется следовать предложению плана выполнения.

Предлагаю вам сравнить план выполнения до и после добавления индекса и увидеть разницу. Возможно, этот индекс заставляет SQL-механизм выбирать плохой план.

Также попробуйте обновить статистику по таблице и индексу и посмотреть, как это влияет.

+0

yeap, SQL Server действительно выбирает плохой план. Я должен подсказать индекс подзапроса (после «EXISTS»), чтобы заставить запрос использовать PK_CT_Contabilidade, а не некластеризованные индексы. – jcosti82

1

попробуйте использовать указатель оптимизатора индекса, чтобы контролировать, какой индекс используется.

, например:

выберите * из названий с (индекс (titleind)) где название = «Гурман Микроволновая печь»

использовать «набор статистики Io на» команды, чтобы увидеть количество страницы, которые сканируются с каждым коммандом query/index и используют параметр «rightclick/show execution plan», чтобы увидеть, как выполняется запрос.

+0

Я попробовал намек на принудительный запрос, используя pk (кластерный индекс). Он работает нормально. Даже существующие оба индекса (codAcesso и codCliente), процесс запроса прошел нормально (менее 1 секунды). Проблема заключается в следующем: я думаю, что оптимизатор запросов должен выбрать правильные индексы. Это не то, что происходит, если существует как индексы (codCliente, так и CodAcesso), и я не «намекаю» на запрос использования PK (на ct_contabilidade), он занимает больше 7 МИНУТ. Я просто хотел бы ПОНИМАТЬ, что случилось, чтобы предотвратить будущие проблемы вроде этого. – jcosti82

Смежные вопросы