Как некластеризованный индекс может выводить столбец, который не включен в индекс

Просмотр плана выполнения, я вижу "столбец A" в списке вывода. Операция сканирования индекса по некластеризованному индексу: "IX_name"

Когда я вижу определение этого индекса. Я не вижу "столбец A" ни в столбцах индекса, ни в столбцах включения.

Как некластеризованный индекс используется для вывода столбца, которого нет в индексе. Не следует ли использовать сканирование таблицы на столе или какой-либо другой индекс, в котором присутствует "столбец А".

2 ответа

Решение

Если сама таблица кластеризована 1, то все вторичные индексы содержат копию ключа кластеризации 2 (ключ, который определяет физический порядок строк в кластеризованной таблице).

Причина: строки в кластерной таблице физически хранятся в B-дереве (не в куче таблицы) и поэтому могут перемещаться, когда узлы B-дерева разделяются или объединяются, поэтому вторичный индекс не может просто содержать строку "указатель" (так как это будет в опасности "болтаться" после того, как ряд движется).

Часто это негативно влияет на производительность 3 - для запросов через вторичный индекс может потребоваться двойной поиск:

  • Сначала найдите вторичный индекс и получите ключ кластеризации.
  • Во-вторых, основываясь на ключе кластеризации, найденном выше, ищите саму кластеризованную таблицу (которая является B-деревом).

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


1 Ака "кластерный индекс" под MS SQL Server.

2 Обычно, но не обязательно ПЕРВИЧНЫЙ КЛЮЧ под MS SQL Server.

3 К сожалению, кластеризация по умолчанию включена в MS SQL Server - люди часто просто оставляют настройки по умолчанию без полного учета их последствий. Если кластеризация не подходит, вы должны явно указать ключевое слово NONCLUSTERED, чтобы отключить ее.

Внутри некластеризованный индекс содержит все ключевые столбцы кластеризованного ключа. Это делается для поддержки операции поиска ключа и для обеспечения того, чтобы внутри каждой строки индекса был уникальный ключ. Для кучи каждый NCI содержит закладку строки по тем же причинам.

Другие вопросы по тегам