Производительность SQL Server: некластеризованный индекс + столбцы ВКЛЮЧЕНО против кластерного индекса - эквивалентно? - PullRequest
7 голосов
/ 02 августа 2010

Привет эксперты по SQL Server Engine;пожалуйста, поделитесь с нами немного своей проницательности ...

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

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

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

ЗАПРОС

SELECT A, B, C FROM TBL ORDER BY A

СЦЕНАРИЙ 1

CREATE CLUSTERED INDEX IX1 ON TBL (A, B, C);

СЦЕНАРИЙ 2

CREATED NONCLUSTERED INDEX IX1 ON TBL (A) INCLUDE (B, C);

Ответы [ 2 ]

5 голосов
/ 02 августа 2010

Действительно, некластеризованный индекс с покрывающими столбцами может играть ту же роль, что и кластеризованный индекс.Стоимость указана во время обновления: чем больше включаемых столбцов, тем больше индексов необходимо обновлять при изменении значения включенного столбца в базовой таблице (в кластеризованном индексе).Кроме того, с увеличением количества включенных столбцов увеличивается размер данных: база данных становится больше, и это может усложнить операции обслуживания.

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

3 голосов
/ 02 августа 2010

В этом примере вы можете получить лучшую производительность с некластеризованным индексом. Но это действительно зависит от дополнительной информации, которую вы не предоставили. Вот несколько мыслей.

SQL Server хранит информацию на страницах размером 8 КБ; это включает в себя данные и индексы. Если ваша таблица содержит только столбцы A, B и C, тогда данные будут храниться примерно на одном и том же количестве страниц данных и страниц некластеризованного индекса. Но если в таблице больше столбцов, тогда для данных потребуется больше страниц. Количество страниц индекса не будет отличаться.

Таким образом, в таблице с большим количеством столбцов, чем требуется для запроса, запрос будет работать лучше с некластеризованным индексом покрытия (индекс со всеми столбцами). Он сможет обрабатывать меньше страниц, чтобы вернуть желаемые результаты.

Конечно, различия в производительности не будут видны, пока вы не получите очень большое количество строк.

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