2010-09-14 1 views
13

Когда таблица имеет кластеризованный индекс в SQL Server, это означает, что все индексированные запросы будут проходить через кластеризованный индекс?Является ли индекс кластеризации SQL Server заменяющим индекс поиска «RID»

Например, если у меня есть таблица с одной некластерным индекса (индексированием один столбец) и поиск строки через этот столбец будет делать Index Seek -> RID -> Data row lookup -> Result

Но если добавить кластерный индекс по другому столбцу то тот же запрос будет делать следующее Index Seek -> Extract clustering key -> Clustered index seek -> Results

Это подразумевает, что некластеризованный индекс больше не «заканчивается» с помощью МПОГ на листе, а с кластерным ключом кластерного индекса? Это правильно?

+0

Получали ли вы эти последовательности из планов выполнения или откуда? –

ответ

13

Да, вы это поняли.

Если у вас есть кластерный индекс, то любой некластеризованный индекс также будет включать столбцы (столбцы) из кластерного индекса в качестве их «поиска» в фактические данные.

Если вы ищете значение в некластеризованном индексе и вам нужно получить доступ к остальным столбцам базовых данных, тогда SQL Server выполняет поиск по закладкам (или «поиск ключа») кластеризованный индекс в кластеризованный индекс (который содержит сами данные, в узлах листового уровня). С кластеризованным индексом вам больше не нужен RID - и, следовательно, вам не нужно обновлять все страницы индекса, если изменяется RID (когда данные перемещаются с одной страницы на другую).

Закладки - довольно дорогостоящие операции, поэтому вы можете добавить дополнительные столбцы в свои некластеризованные индексы с помощью инструкции INCLUDE. При этом ваш некластеризованный индекс будет содержать эти дополнительные столбцы на листах листового уровня, и если вам нужны только столбцы, которые содержатся в этом наборе данных, ваш запрос может быть удовлетворен самим некластеризованным индексом (в этом case, это называется «индекс покрытия»), и вы можете сэкономить себе серию поиска по закладкам.

+2

Отличный ответ, особенно отзыв о INCLUDE, с которым я раньше не сталкивался. –

1

№ Не каждый запрос будет использовать кластеризованный индекс. Если запрос «закрыт» некластеризованным индексом (все столбцы, необходимые для запроса, содержатся в индексе NC), то SQL Server должен будет только прочитать эти индексные страницы и не выполнять поиск по закладкам. На самом деле оптимизатор часто предпочитает использовать индекс NC покрытия, когда это возможно, потому что индекс NC обычно меньше, чем кластеризованный индекс, и поэтому обычно быстрее сканируется.

1

Когда таблица имеет кластерный индекс в SQL Server, это означает, что все индексированные запросы будут проходить через кластеризованный индекс?

Номер

Если запрос использует только поля, покрытые вторичным индексом и/или кластерного индекса, может (и, скорее всего, будет) предпочтительнее вторичный индекс.

CREATE TABLE test (id INT NOT NULL PRIMARY KEY, value1 INT NOT NULL, value2 INT NOT NULL) 

CREATE INDEX ix_test_value2 ON test (value2) 

SELECT value2, id 
FROM test 

Запрос выше, скорее всего, использовать ix_test_value2, поскольку она содержит всю информацию, необходимую запрос, но меньше по размеру.

Это означает, что некластеризованный индекс больше не «заканчивается» с RID на листе, а с ключом кластеризации кластерного индекса? Это правильно?

Да, с некоторыми небольшими поправками:

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

  • Если вторичный индекс охватывает некоторые столбцы кластерного индекса, то только отсутствующие части кластерного ключа добавляются в виде указателей строк.

  • Если вторичный индекс объявлен UNIQUE, кластерный ключ добавляется только к записям уровня листа вторичного индекса.

+0

+1, интересная информация в конце там. –

 Смежные вопросы

  • Нет связанных вопросов^_^