Вопрос: почему план выполнения показывает сканирование таблицы при фильтрации по индексу?
Ядро СУБД: 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 приводит к поиску.