2010-05-27 3 views
3

У меня есть таблица с почтовыми индексами со следующими столбцами:Какой индекс используется в выборе и почему?

id - PRIMARY KEY 
code - NONCLUSTERED INDEX 
city 

Когда я выполнить запрос

SELECT TOP 10 * FROM ZIPCodes 

Я получаю результаты, отсортированные по id колонку. Но когда я изменить запрос:

SELECT TOP 10 id FROM ZIPCodes 

Я получаю результаты, отсортированные по code колонку. Опять же, когда я изменить запрос на:

SELECT TOP 10 code FROM ZIPCodes 

получить результаты сортируются по code колонку снова. И, наконец, когда я изменяю:

SELECT TOP 10 id,code FROM ZIPCodes 

Я получаю результаты, отсортированные по id колонку.

Мой вопрос находится в названии вопроса. Я знаю, какие индексы используются в запросах, но мой вопрос: почему эти индексы используются? I второй запрос (SELECT TOP 10 id FROM ZIPCodes) не был бы быстрее, если бы использовался индекс кластеров? Как механизм запроса выбирает, какой индекс использовать?

ответ

3

Поскольку вы не запрашиваете определенный набор данных, нет оптимального способа выбрать, какие строки будут возвращены. Подсказка: TOP без ORDER BY является бессмысленным.

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

2

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

Чтобы подчеркнуть смысл, предположите, что столбец города был столбцом VARCHAR (4000). Если бы он использовал кластерный индекс, ему пришлось бы прочитать над столбцом города для каждой обрабатываемой строки. Используя индекс nonclusted Code, он просто должен прочитать байты, которые он будет возвращать.

1

Если у вас есть индекс, который имеет код в качестве столбца первого или единственного столбца, в то время как он не является первым столбцом в вашей таблице, вероятно, быстрее сканировать индекс, чем сканировать таблицу, поскольку вы выбрав только один столбец. Вы должны посмотреть на план выполнения немного подробнее.

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