Разница между кластерным и некластеризованным индексом
Мне нужно добавить правильное index
к моим столам и нужна помощь.
Я запутался и нужно уточнить несколько моментов:
Должен ли я использовать индекс для
non-int
столбцы? Почему, почему нетЯ много читал о
clustered
а такжеnon-clustered
Индекс еще не могу решить, когда использовать один над другим. Хороший пример поможет мне и многим другим разработчикам.
Я знаю, что не должен использовать индексы для столбцов или таблиц, которые часто обновляются. Что еще я должен быть осторожен и как я могу знать, что все хорошо, прежде чем перейти к этапу тестирования?
6 ответов
Вам действительно нужно держать в стороне две проблемы:
1) первичный ключ - это логическая конструкция - один из ключей-кандидатов, который однозначно и надежно идентифицирует каждую строку в вашей таблице. На самом деле это может быть что угодно - INT, GUID, строка - выберите то, что наиболее подходит для вашего сценария.
2) ключ кластеризации (столбец или столбцы, которые определяют "кластеризованный индекс" в таблице) - это вещь, связанная с физическим хранилищем, и здесь вам лучше всего выбрать небольшой, стабильный, постоянно увеличивающийся тип данных - INT или BIGINT как вариант по умолчанию.
По умолчанию первичный ключ в таблице SQL Server также используется в качестве ключа кластеризации, но это не обязательно должно быть так!
Я бы применил одно практическое правило: любая "обычная" таблица (та, которую вы используете для хранения данных, это таблица поиска и т. Д.) Должна иметь ключ кластеризации. Там действительно нет смысла не иметь ключ кластеризации. На самом деле, вопреки распространенному мнению, наличие ключа кластеризации на самом деле ускоряет все общие операции - даже вставки и удаления (поскольку организация таблиц отличается и обычно лучше, чем с кучей - таблица без ключа кластеризации).
Кимберли Трипп, королева индексирования, имеет множество отличных статей на тему, зачем нужен ключ кластеризации, и какие столбцы лучше всего использовать в качестве ключа кластеризации. Так как вы получаете только один на таблицу, крайне важно выбрать правильный ключ кластеризации, а не просто какой-либо ключ кластеризации.
- GUID как ПЕРВИЧНЫЙ КЛЮЧ и / или кластерный ключ
- Дискуссия по кластерному индексу продолжается
- Постоянно растущий ключ кластеризации - Дебаты о кластеризованных индексах.......... снова!
- Дисковое пространство дешево - не в этом дело!
Марк
Кластерный индекс изменяет способ хранения строк. Когда вы создаете кластерный индекс для столбца (или нескольких столбцов), SQL-сервер сортирует строки таблицы по этим столбцам. Это как словарь, где все слова отсортированы в алфавитном порядке во всей книге.
Некластеризованный индекс, с другой стороны, не изменяет способ хранения строк в таблице. Он создает совершенно другой объект в таблице, который содержит столбцы, выбранные для индексации, и указатель на строки таблицы, содержащие данные. Это похоже на указатель на последних страницах книги, где ключевые слова сортируются и содержат номер страницы с материалом книги для более быстрой ссылки.
Вы должны использовать индексы для повышения производительности сервера SQL. Обычно это означает, что столбцы, используемые для поиска строк в таблице, индексируются.
Кластерные индексы заставляют сервер SQL упорядочивать строки на диске в соответствии с порядком индекса. Это подразумевает, что если вы обращаетесь к данным в порядке кластерного индекса, данные будут присутствовать на диске в правильном порядке. Однако, если столбцы, имеющие кластеризованный индекс, часто изменяются, то строки на диске будут перемещаться, вызывая дополнительные затраты, что, как правило, не очень хорошая идея.
Иметь много индексов тоже не хорошо. Они стоят для поддержания. Итак, начните с очевидных, а затем профиль, чтобы увидеть, какие из них вы пропустите и выиграете от этого. Вам не нужны они с самого начала, они могут быть добавлены позже.
Большинство типов данных столбцов можно использовать при индексации, но лучше индексировать маленькие столбцы, чем большие. Также обычно создаются индексы по группам столбцов (например, страна + город + улица).
Также вы не заметите проблем с производительностью, пока в ваших таблицах не будет достаточно данных. И еще одна вещь, о которой стоит подумать, это то, что SQL-серверу нужна статистика для правильной оптимизации запросов, поэтому убедитесь, что вы ее сгенерировали.
Сравнение некластеризованного индекса с кластерным индексом с примером
В качестве примера некластеризованного индекса, скажем, у нас есть некластеризованный индекс в столбце EmployeeID. Некластеризованный индекс будет хранить как значение
EmployeeID
И указатель на строку в таблице Employee, где это значение фактически хранится. Но кластеризованный индекс, с другой стороны, будет на самом деле хранить данные строки для определенного EmployeeID - поэтому, если вы выполняете запрос, который ищет EmployeeID, равный 15, данные из других столбцов таблицы будут выглядеть как
EmployeeName, EmployeeAddress и т. Д.
, фактически все они будут храниться в листовом узле самого кластерного индекса.
Это означает, что с некластеризованным индексом требуется дополнительная работа, чтобы следовать этому указателю на строку в таблице, чтобы получить любые другие желаемые значения, в отличие от кластеризованного индекса, который может просто обращаться к строке напрямую, поскольку она хранится в тот же порядок, что и у самого кластерного индекса. Таким образом, чтение из кластеризованного индекса обычно происходит быстрее, чем чтение из некластеризованного индекса.
В общем, используйте индекс для столбца, который будет использоваться (много) для поиска в таблице, например первичный ключ (который по умолчанию имеет кластерный индекс). Например, если у вас есть запрос (в псевдокоде)
SELECT * FROM FOO WHERE FOO.BAR = 2
Вы можете разместить индекс на FOO.BAR. Кластерный индекс должен использоваться для столбца, который будет использоваться для сортировки. Кластерный индекс используется для сортировки строк на диске, поэтому вы можете использовать только одну таблицу на таблицу. Например, если у вас есть запрос
SELECT * FROM FOO ORDER BY FOO.BAR ASCENDING
Возможно, вы захотите рассмотреть кластерный индекс на FOO.BAR.
Вероятно, наиболее важным фактором является то, сколько времени занимают ваши запросы. Если запрос не занимает много времени или используется не часто, возможно, не стоит добавлять индексы. Как всегда, сначала профиль, а затем оптимизировать. SQL Server Studio может дать вам советы по оптимизации, а MSDN содержит некоторую информацию 1, которая может оказаться полезной.
Быстрее читать, чем не кластер, так как данные физически хранятся в порядке индекса, мы можем создать только один для таблицы.(индекс кластера)
быстрее для операции вставки и обновления, чем индекс кластера. мы можем создать n номер некластерного индекса.