Зачем сканировать таблицы при фильтрации по индексу? - PullRequest
0 голосов
/ 20 июня 2020

Вопрос: почему план выполнения показывает сканирование таблицы при фильтрации по индексу?

Ядро СУБД: SQL Сервер 2019

Количество строк таблицы: 4000

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

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

Create Table People (LastName NVarchar(50), FirstName NVarchar(50))

Create NONCLUSTERED INDEX Idx_LastName ON People (LastName)

Таблица заполнена 4000 строками данных, без нулей.

Если я выполню следующий запрос:

SELECT LastName FROM People WHERE LastName = 'Smith'

я получу то, что ожидал, а именно поиск индекса для Idx_LastName.

Однако, если я выполню:

SELECT LastName, FirstName FROM People WHERE LastName = 'Smith'

План выполнения показывает сканирование таблицы. Я предполагаю, что это «полное сканирование таблицы».

Почему я получаю сканирование таблицы, когда я все еще фильтрую только индексированный столбец и выбираю только значения из неиндексированного столбца, которые конкретно соответствуют отфильтрованное подмножество данных - в данном случае фамилии, соответствующие 'smith'?

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

Итак, зачем нужно полное сканирование таблицы?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...