2010-07-03 2 views
15

У меня есть таблица пользователя с кучей индексов. Один из них - уникальный индекс в столбце AccountIdentifier.Почему этот запрос sql выполняет ключевой поиск?

Поскольку это уникальный индекс, почему требуется ключевой поиск в дополнение к поиску индекса? Стрелка подсказки индекса сообщает, что возвращается только одна запись. Я также попытался преобразовать индекс в тип «уникальный ключ».

alt text http://s3.amazonaws.com/brandonc.baconfile.com/pitchurs/tmp/capture_2.png

+2

В стороне: никогда не делайте 'SELECT *' на производственной системе - ** НИКОГДА ** - никаких исключений. Это плохая практика для начала .... –

ответ

17

Потому что выбор *.

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

Чтобы избежать bookmark lookup вы должны сделать, не входящих в кластерный индекс индекс покрытия (в идеале за счет уменьшения числа столбцов в списке выбора, но можно также путем добавления новых столбцов в себе или в качестве included columns индекса)

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

+1

Я немного экспериментировал. Таким образом, казалось бы, выбирая что-либо не в индексе, результаты в ключевом поиске. В этом есть смысл. –

+1

@BC - В принципе, да, но если у вас есть кластерный индекс, вы можете считать эти столбцы автоматически включенными. –

13

Ключевой поиск не означает «искать ключ», а «искать строку на основе ключа».

7

Посмотреть эти статьи и сообщения в блоге для некоторых получения более подробной информации о ключевых Lookups/закладки поисков:

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