Какой индекс используется в select и почему?



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



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) не было бы быстрее, если бы использовался индекс кластеризации? Как механизм запросов выбирает, какой индекс использовать?

585   3  

3 ответов:

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

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

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

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

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

Comments

    Ничего не найдено.