SQL Server 2008, похоже, выбирает индекс PK для каждого запроса, даже если кажется, что существует лучший. - PullRequest
2 голосов
/ 04 марта 2011

Похоже на ситуацию, похожую на , о чем здесь просят , но я не уверен, что его данные такие же, как у меня.

По сути, у меня есть реляционная таблица, мы назовем ее Пользователь:

User
-----------
int Id
varchar<100> Name
int AddressId
varchar<max> Description

и имеет следующие показатели: PK_User_Id - очевидно, первичный ключ. IX_User_AddressId - включает только AddressId.

Когда я запускаю следующий запрос:

select Id, Name, AddressId, Description from User where AddressId > 200

План выполнения показывает, что сканирование было выполнено и использовался PK_User_Id.

Если я выполню этот запрос:

select AddressId from User where AddressId > 200

План выполнения показывает, что сканирование было выполнено и использовался IX_User_AddressId.

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

Итак, мой вопрос по SQL noob таков: что в мире нужно сделать, чтобы мои запросы использовали самый быстрый индекс? Будьте очень конкретны, потому что я должен быть отсталым, так как не могу понять это.

Ответы [ 2 ]

4 голосов
/ 04 марта 2011

Ваш запрос выглядит как наклоненный, так как ваш индекс не охватывает все поля, которые вы хотели, я бы сказал, что он наклонен (см. Kimberly Tripp - Tipping Point ) и использовал индекс первичного ключа который я бы весьма неплохо предположил как ваш кластерный индекс.

1 голос
/ 04 марта 2011

Если ваш индекс IX_User_AddressId содержит только AddressId, SQL должен выполнить поиск закладок в базовой таблице, чтобы получить другие столбцы (Id, Name, Description).Если таблица достаточно мала, SQL может решить, что более эффективно сканировать всю таблицу, а не использовать альтернативный индекс в сочетании с поиском по закладкам.Когда вы добавляете эти другие столбцы в свой индекс, вы создаете так называемый покрывающий индекс, что означает, что все столбцы, необходимые для удовлетворения вашего запроса, доступны в самом индексе.Это хорошо, так как исключит поиск по закладкам.

...