Почему сервер SQL не использует мой кластерный индекс и не сканирует некластерный индекс? - PullRequest
1 голос
/ 25 апреля 2020

У меня есть таблица patient с несколькими столбцами, кластеризованный индекс для столбца ID и некластеризованный индекс для столбца birth.

create clustered index CI_patient on dbo.patient (ID)
create nonclustered index NCI_patient on dbo.patient (birth)

Вот мои запросы:

select * from patient 

select ID from patient

select birth from patient 

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

У меня вопрос, почему второй «сканирование индекса некластеризовано»? Предполагается, что в этом столбце есть кластеризованный индекс, в этом смысле это должен быть просмотр кластерного индекса? Есть мысли по этому поводу?

query

1 Ответ

2 голосов
/ 25 апреля 2020

По сути, ваш второй запрос хочет получить все ID значения из таблицы (без WHERE предложения или чего-либо еще).

SQL Сервер может сделать это двумя способами:

  • Сканирование кластеризованного индекса - в основном полное сканирование таблицы для чтения всех данных из всех строк и извлечения ID из каждой строки - будет работать, но оно загружает ВЕСЬ таблицу , по одному один
  • выполняет сканирование по некластеризованному индексу, поскольку каждый некластеризованный индекс также включает столбец (столбцы) кластеризации на уровне листьев. Поскольку это индекс, который на меньше , чем полная таблица, для этого SQL Сервер должен загрузить меньше страниц данных и, таким образом, может дать ответ - все ID значений из всех строк - быстрее, чем при полном сканировании таблицы (сканирование кластерного индекса)

Оптимизатор на основе стоимости в SQL Сервер просто выбирает более эффективный маршрут, чтобы получить ответ на вопрос, который вы задали вторым запросом.

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