Заменяет ли кластерный индекс SQL Server «индекс» поиска RID - PullRequest
13 голосов
/ 14 сентября 2010

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

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

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

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

Ответы [ 3 ]

13 голосов
/ 14 сентября 2010

Да, вы поняли это в значительной степени.

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

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

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

1 голос
/ 15 сентября 2010

Если таблица имеет кластеризованный индекс в 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, кластерный ключ добавляется только к конечным записям вторичного индекса.

1 голос
/ 15 сентября 2010

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

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