Разница между кластеризованным и некластеризованным индексом

Мне нужно добавить правильный индекс в мои таблицы и вам нужна помощь.

Я смущен и должен уточнить несколько моментов:

  • Должен ли я использовать индекс для столбцов non-int? Почему/почему не

  • Я много читал о кластерном и некластеризованном индексе, но я все еще не могу решить, когда использовать один над другим. Хороший пример поможет мне и многим другим разработчикам.

Я знаю, что я не должен использовать индексы для столбцов или таблиц, которые часто обновляются. Что еще я должен быть осторожен и как я могу знать, что все хорошо, прежде чем идти на этап тестирования?

4b9b3361

Вам действительно нужно оставить две проблемы:

1) первичный ключ - это логическая конструкция - один из ключей-кандидатов, который однозначно и надежно идентифицирует каждую строку в вашей таблице. Это может быть что угодно, на самом деле - INT, GUID, строка - выберите, что имеет наибольшее значение для вашего сценария.

2) ключ кластеризации (столбец или столбцы, которые определяют "кластеризованный индекс" в таблице) - это физическое хранилище, и здесь небольшая, стабильная, когда-либо -выполнение типа данных - ваш лучший выбор - INT или BIGINT в качестве опции по умолчанию.

По умолчанию первичный ключ в таблице SQL Server также используется в качестве ключа кластеризации, но это не обязательно так!

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

У Кимберли Триппа, Королевы Индексации, есть много отличных статей на тему, почему у вас есть ключ кластеризации, и какие столбцы, которые лучше всего использовать в качестве ключа кластеризации. Поскольку вы получаете только один за стол, крайне важно выбрать ключ кластеризации right, а не только кластерный ключ.

Марк

74
ответ дан 22 февр. '11 в 0:32
источник

Кластеризованный индекс изменяет способ хранения строк. Когда вы создаете кластерный индекс для столбца (или нескольких столбцов), SQL-сервер сортирует строки таблиц по этим столбцам. Это похоже на словарь, где все слова сортируются в алфавитном порядке во всей книге.

Некластеризованный индекс, с другой стороны, не изменяет способ хранения строк в таблице. Он создает совершенно другой объект внутри таблицы, который содержит столбцы (столбцы), выбранные для индексирования, и указатель обратно к строкам таблицы, содержащим данные. Это похоже на индекс на последних страницах книги, где ключевые слова отсортированы и содержат номер страницы в материале книги для более быстрой справки.

252
ответ дан 21 авг. '11 в 14:48
источник

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

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

Наличие многих индексов тоже не очень хорошо. Они стоят для поддержания. Итак, начните с очевидных, а затем профиль, чтобы узнать, какие из них вы пропустите и выиграете. Вы не нуждаетесь в них с самого начала, их можно добавить позже.

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

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

26
ответ дан 21 февр. '11 в 23:02
источник

Сравнение некластеризованного индекса с кластерным индексом с примером

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

КодСотрудника

И указатель на строку в таблице Employee, где это значение фактически сохраняется. Но сгруппированный индекс, с другой стороны, фактически сохранит данные строки для определенного EmployeeID, поэтому, если вы выполняете запрос, который ищет EmployeeID из 15, данные из других столбцов таблицы, например

EmployeeName, EmployeeAddress и т.д.

. будут фактически сохранены в листе node самого кластерного индекса.

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

19
ответ дан 24 апр. '13 в 15:44
источник

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

SELECT * FROM FOO WHERE FOO.BAR = 2

Возможно, вы захотите поместить индекс в FOO.BAR. Кластерный индекс следует использовать для столбца, который будет использоваться для сортировки. Кластеризованный индекс используется для сортировки строк на диске, поэтому для каждой таблицы может быть только один. Например, если у вас есть запрос

SELECT * FROM FOO ORDER BY FOO.BAR ASCENDING

Возможно, вы захотите рассмотреть кластерный индекс на FOO.BAR.

Вероятно, самое важное соображение - сколько времени ваши запросы предпринимают. Если запрос не занимает много времени или не используется очень часто, возможно, не стоит добавлять индексы. Как всегда, сначала профиль, затем оптимизируйте. SQL Server Studio может дать вам рекомендации по оптимизации, а MSDN содержит некоторую информацию 1, которая может оказаться полезной

4
ответ дан 21 февр. '11 в 23:07
источник

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

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

2
ответ дан 08 июня '13 в 18:11
источник