Является ли индекс кластеров SQL Server заменяющим индекс поиска индекса RID,
Когда таблица имеет кластерный индекс в SQL Server, это означает, что все индексированные запросы будут проходить через кластеризованный индекс?
Например, если у меня есть таблица с одним некластеризованным индексом (индексирование одного столбца) и поиск строки через этот столбец, она сделает Index Seek -> RID -> Data row lookup -> Result
Но если я добавлю кластерный индекс в другой столбец, то тот же запрос сделает следующее Index Seek -> Extract clustering key -> Clustered index seek -> Results
Это означает, что некластеризованный индекс больше не "заканчивается" с RID на листе, а с кластерным ключом кластерного индекса? Правильно ли это?
Ответы
Ответ 1
Да, вы это поняли.
Если у вас есть кластерный индекс, то любой некластеризованный индекс также будет включать столбцы (столбцы) из кластерного индекса в качестве "поиска" в фактические данные.
Если вы ищете значение в некластеризованном индексе и вам нужно получить доступ к оставшимся столбцам базовых данных, тогда SQL Server выполняет поиск по закладкам (или "поиск ключа" ) из некластеризованного индекс в кластеризованный индекс (который содержит сами данные, в узлах листового уровня). С кластеризованным индексом вам больше не нужен RID - и, следовательно, вам не нужно обновлять все страницы индекса, если изменяется RID (когда данные перемещаются с одной страницы на другую).
Закладки - довольно дорогостоящие операции, поэтому вы можете добавлять дополнительные столбцы к своим некластеризованным индексам с помощью инструкции INCLUDE
. При этом ваш некластеризованный индекс будет содержать эти дополнительные столбцы на листах листового уровня, и если вам нужны только столбцы, которые содержатся в этом наборе данных, ваш запрос может быть удовлетворен самим некластеризованным индексом (в этом case, он называется "индекс покрытия" ), и вы можете сэкономить серию поиска по закладкам.
Ответ 2
Нет. Не каждый запрос будет использовать кластерный индекс. Если запрос "закрыт" некластеризованным индексом (все столбцы, необходимые для запроса, содержатся в индексе NC), то SQL Server должен будет только прочитать эти индексные страницы и не выполнять поиск по закладкам. На самом деле оптимизатор часто предпочитает использовать индекс NC для покрытия, когда это возможно, потому что индекс NC обычно меньше, чем кластеризованный индекс, и поэтому обычно быстрее сканируется.
Ответ 3
Когда таблица имеет кластерный индекс в 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
, кластеризованный ключ добавляется только к записям на уровне листа вторичного индекса.