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

Я использую образец базы данных из учебного пособия по SQL Server 2012, немного изучая индексы, поэтому я решил попробовать и посмотреть, как это работает.

В таблице Orders есть индекс shippostalcode, поэтому я попытался поместить его в предложение where, я знаю, что в этой таблице более 850 записей, и этот код хорошо разделен, например:

10328
10195
10342
10318
10196
10139
10294
10354
10199
10157
10137
10258
10274
10286
10158
10167
10329
10351

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

введите здесь описание изображения

ИЗМЕНИТЬ:

Я сделал :

SELECT [orderid] 
      ,[shippostalcode]
  FROM [TSQL2012].[Sales].[Orders]
  WHERE shippostalcode = '10307'

Что дало мне поиск по индексу. Что наводит меня на мысль (из того немногого, что я узнал), что SQL Server может думать, что сканирование выполняется быстрее, чем поиск по закладкам для остальных столбцов?

РЕДАКТИРОВАТЬ 2:

Прочитав о переломном моменте здесь: http://www.sqlskills.com/blogs/kimberly/why-arent-those-nonclustered-indexes-being-used/

Там написано, что около 30%. Я использовал запрос отсюда, чтобы получить общее количество страниц в моей таблице:

Определение количества страниц в каждой таблице SQL без использования DBCC

У меня 49 б/у и 53 зарезервировано. Таким образом, 30% от 49 = 14,7 * 17 (каждая страница хранит столько же) составляет около 250 строк. Но мой запрос возвращал только 9, так что это было далеко не переломный момент.


person sprocket12    schedule 15.11.2013    source источник


Ответы (1)


Я понял это, как упоминалось в некоторых статьях, которые я читал, селективность должна быть ниже 1%. Я был введен в заблуждение статьей о переломных моментах, думая, что он перейдет в режим сканирования, только если он возвращает 30%+.

Но фактическое тестирование показывает, что все, что возвращает 6+ строк, является сканированием, а все, что меньше, — поиском.

Поэтому, если он возвращает около 0,5%, он выполняет поиск, иначе сканирование. 0,5% моих 830 строк — это 4,15 строки.

Надеюсь, это поможет кому-то.

person sprocket12    schedule 15.11.2013