Индекс не используется + SQL Server 2005 - PullRequest
0 голосов
/ 16 ноября 2010

Вот мой запрос

Declare @StartDateTime datetime, @EndDateTime datetime

Select @StartDateTime = '2010-11-15', @EndDateTime = '2010-11-16'

Select PracticeCode, AccountNo, ProcCd, Modifier , ChargeDos, Paid as Amt, CreatedDate,
     case When Paid > 0 then 'P' 
          When Paid = 0 and WrittenOff = DueAmt then 'A'
          Else 'O' 
     End as Status
     From Trn_Postings
     Where CreatedDate >= @StartDateTime and CreatedDate <= @EndDateTime
            --and ManualOverride in ('S','F','X','G','O')
            and ManualOverride in ('N','U')

Редактировать: Дата создания - это столбец даты и времени, который содержит дату и время создания записи

У меня есть отдельные индексы как для CreatedDate, так и для ManualOverride. Но план выполнения показывает сканирование кластерного индекса. Таблица имеет почти миллионную запись и может увеличиться в 4-5 раз в ближайшем будущем.

Самым удивительным является то, что если я изменю предложение where, как показано ниже, оно использует оба индекса. Я просто не знаю почему.

     Where CreatedDate >= @StartDateTime and CreatedDate <= @EndDateTime
            and ManualOverride in ('S','F','X','G','O')
            --and ManualOverride in ('N','U')

Как мне заставить Sql использовать индексы ...

Далее, если я использую Не в предложении, индекс не будет использоваться.

Ответы [ 3 ]

0 голосов
/ 16 ноября 2010

Рассмотрите возможность обновления статистики:

update statistics Trn_Postings with fullscan
0 голосов
/ 16 ноября 2010

Я бы предложил создать составной индекс поверх CreatedDate и ManualOverride.Когда оба условия могут быть выполнены с помощью индексов, это то, что оптимизатор делает.индексов.Он решил, что COST (Использовать индекс CreatedDate + поиск CI + условие)> COST (Scan CI)Это неправильно, но иногда это случается.Вероятно, будет использоваться индекс по обоим столбцам (сначала CreatedDate).Или вы можете попытаться форсировать его, используя подсказку INDEX запроса .Он все еще может игнорировать подсказку.

0 голосов
/ 16 ноября 2010

Учитывая, что для каждой найденной строки, которая соответствует предложению where, ему придется возвращаться к кластерному индексу, чтобы получить данные, если есть много возвращаемых данных, может быть более эффективно просто пройти через это все и вытяните нужные строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...