Каковы различия между кластеризованным и некластеризованным индексом?

277

Каковы различия между а clusteredи а non-clustered index?

Эрик Лабашоски
источник
8
Вы можете иметь только один кластерный индекс на таблицу. Но есть много других отличий ...
Том Робинсон
5
Кластерный индекс фактически описывает порядок, в котором записи физически хранятся на диске, поэтому у вас может быть только один. Некластеризованный индекс определяет логический порядок, который не соответствует физическому порядку на диске.
Джош
1
Кластеризация в основном означает, что данные в указанном физическом порядке в таблице. Вот почему вы можете иметь только один на стол. Некластеризованный означает, что это «только» логический порядок.
Бири
2
@biri что такое "логический" порядок? Некластеризованный индекс хранит ключи индекса в физическом порядке и сохраняет указатель на таблицу, а именно ключ кластерного индекса.
Стефани Пейдж
@Stephanie Page: логично с точки зрения таблицы. Конечно, некластеризованные индексы упорядочены физически в самом индексе.
Бири

Ответы:

268

Кластерный индекс

  • Только один на стол
  • Быстрее читать, чем не кластеризовано, поскольку данные физически хранятся в порядке индекса

Некластерный индекс

  • Может использоваться много раз за стол
  • Быстрее для операций вставки и обновления, чем кластерный индекс

Оба типа индекса улучшат производительность при выборе данных с полями, которые используют индекс, но замедляют операции обновления и вставки.

Из-за более медленной вставки и обновления кластеризованные индексы должны быть установлены в поле, которое обычно является инкрементным, то есть Id или Timestamp.

SQL Server обычно использует индекс только в том случае, если его селективность превышает 95%.

Martynnw
источник
9
Есть также соображения хранения. При вставке строк в таблицу без кластеризованного индекса строки сохраняются на странице вплотную, и обновление строки может привести к перемещению строки в конец таблицы, оставляя пустое пространство и фрагментируя таблицу и индексы.
Иеремия Пешка
4
вам не нужно заботиться о том, что х. Все, что вам нужно знать, это то, что для приложения с миллионами пользователей значение x будет значительным
Pacerier
14
Это чисто догма. Это не «быстрее читать, потому что данные хранятся в порядке». Читать быстрее, потому что вы избегаете чтения индекса И ТОГО чтения таблицы. Сканирование по дальности быстрее (если это имеет смысл), потому что данные хранятся в порядке. т.е. фактор кластеризации идеален.
Стефани Пейдж
6
Также идея, что 95% записей должны быть уникальными, является ошибкой. Скажем, у вас есть таблица с 1 000 000 строк и вы индексируете столбец с 500 000 ключей. 0% уникальны, но каждый ключ возвращает 2 из миллиона строк. Этот индекс абсолютно полезен, несмотря на то, что 0% записей являются уникальными.
Стефани Пейдж
2
«данные физически хранятся в индексном порядке», что вы подразумеваете под этим? На одном уровне это тривиально, потому что страницы данных и листовые страницы индекса - это одно и то же - так что, очевидно, порядок одного описывает порядок другого. Однако это не обязательно в каком-то определенном порядке, например, в порядке ключа индекса stackoverflow.com/questions/1251636/…
Мартин Смит
79

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

Все остальные индексы должны быть некластеризованными. Некластеризованный индекс содержит дубликаты данных из проиндексированных столбцов, упорядоченные вместе с указателями на фактические строки данных (указатели на кластеризованный индекс, если он есть). Это означает, что доступ к данным через некластеризованный индекс должен проходить через дополнительный уровень косвенности. Однако, если вы выберете только те данные, которые доступны в индексированных столбцах, вы можете получить данные обратно непосредственно из дублированных индексных данных (поэтому рекомендуется выбирать только те столбцы, которые вам нужны, а не использовать *)

rslite
источник
3
«Однако, если вы выберете только те данные, которые доступны в индексированных столбцах, вы можете получить данные обратно непосредственно из дублированных данных индекса» - да, это важное исключение из предпочтительной эвристики кластеризованного индекса. Я предполагаю, что в этом случае у вас, по сути, есть кластеризованный индекс, но в таблице вы запрашиваете меньше данных, поэтому потенциально они могут быть прочитаны быстрее с диска.
Сатнхак
34

Кластерные индексы хранятся физически в таблице. Это означает, что они самые быстрые, и вы можете иметь только один кластеризованный индекс на таблицу.

Некластеризованные индексы хранятся отдельно, и вы можете иметь сколько угодно.

Лучший вариант - установить кластерный индекс для наиболее часто используемого уникального столбца, обычно для PK. У вас всегда должен быть хорошо выбранный кластеризованный индекс в ваших таблицах, если только нет веских причин - не можете придумать ни одного, но, эй, он может быть там - потому что этого не происходит.

Сантьяго Сепас
источник
3
Можете ли вы подробнее рассказать о том, «у нас всегда должен быть кластеризованный индекс в наших таблицах»? без уточнения это утверждение просто неверно из-за слова всегда
Pacerier
1
Вы правы, Pacerier, не следует пренебрегать абсолютными утверждениями. Хотя я не знаю ни одного случая, когда у вас не должно быть хорошо выбранного кластерного индекса, такой случай может существовать, поэтому я изменил свой ответ на более общую версию.
Сантьяго Сепас
28

Кластерный индекс

  1. Для таблицы может быть только один кластерный индекс.
  2. Обычно делается по первичному ключу.
  3. Конечные узлы кластерного индекса содержат страницы данных.

Некластерный индекс

  1. Для таблицы может быть только 249 некластеризованных индексов (до версии 2005 SQL Server более поздние версии поддерживают до 999 некластеризованных индексов).
  2. Обычно делается на любую клавишу.
  3. Конечный узел некластеризованного индекса не состоит из страниц данных. Вместо этого конечные узлы содержат строки индекса.
Jojo
источник
24

Кластерный индекс

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

Некластерный индекс

  • В таблице может быть любое количество некластеризованных индексов
  • Не влияет на физический порядок. Создайте логический порядок для строк данных и используйте указатели на физические файлы данных
  • Вставка / обновление данных происходит быстрее, чем кластерный индекс
  • Используйте дополнительное пространство для хранения логической структуры

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

Ласита Япа
источник
10

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

Некластеризованный означает, что это «только» логический порядок.

Biri
источник
9

Плюсы:

Кластерные индексы отлично работают для диапазонов (например, выберите * из my_table, где my_key между @min и @max)

В некоторых случаях СУБД не придется выполнять работу по сортировке, если вы используете оператор orderby.

Минусы:

Кластерные индексы могут замедлять вставки, поскольку физические макеты записей должны быть изменены по мере ввода записей, если новые ключи расположены не в последовательном порядке.

Джованни Гальбо
источник
6

Кластерный индекс - это, по сути, отсортированная копия данных в индексированных столбцах.

Основное преимущество кластеризованного индекса состоит в том, что когда ваш запрос (поиск) находит данные в индексе, то для извлечения этих данных не требуется никакого дополнительного ввода-вывода.

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

Эд Гинесс
источник
6

Индексированная база данных состоит из двух частей: набора физических записей, которые расположены в произвольном порядке, и набора индексов, которые идентифицируют последовательность, в которой следует читать записи, чтобы получить результат, отсортированный по некоторому критерию. Если между физическим расположением и индексом нет корреляции, то для считывания всех записей по порядку может потребоваться выполнение множества независимых операций чтения одной записи. Поскольку база данных может считывать десятки последовательных записей за меньшее время, чем требуется для чтения двух непоследовательных записей, производительность может быть улучшена, если записи, которые являются последовательными в индексе, также последовательно хранятся на диске.

Например, если начать с пустой некластеризованной базы данных и добавить 10 000 записей в произвольной последовательности, записи, вероятно, будут добавлены в конце в том порядке, в котором они были добавлены. Для считывания базы данных по порядку по индексу потребуется 10 000 операций чтения одной записи. Однако если использовать кластерную базу данных, при добавлении каждой записи система может проверить, была ли предыдущая запись сохранена сама по себе; если он обнаружит, что это так, он может записать эту запись вместе с новой в конце базы данных. Затем он может посмотреть на физическую запись перед слотами, в которых находились перемещенные записи, и посмотреть, была ли запись, которая за ней следовала, сохранена сама собой. Если он обнаружит, что это так, он может переместить эту запись в это место. Использование такого подхода приведет к тому, что многие записи будут сгруппированы в пары,

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

Supercat
источник
5

Кластерный индекс фактически описывает порядок, в котором записи физически хранятся на диске, поэтому у вас может быть только один.

Некластеризованный индекс определяет логический порядок, который не соответствует физическому порядку на диске.

мистифицировать
источник
2

Вы могли пройти часть теории из приведенных выше постов:

-Кластерный индекс, как мы видим, указывает непосредственно на запись, то есть непосредственно, поэтому поиск занимает меньше времени. Кроме того, для хранения индекса не потребуется дополнительная память / пространство

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

введите описание изображения здесь

Нандкишор Нангре
источник
0

// Скопировано из MSDN, вторая точка некластеризованного индекса четко не упоминается в других ответах.

кластерный

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

Некластеризованный

  • Некластеризованные индексы имеют структуру, отдельную от строк данных. Некластеризованный индекс содержит значения ключа некластеризованного индекса, и
    каждая запись значения ключа имеет указатель на строку данных, которая содержит значение ключа.
  • Указатель из строки индекса в некластеризованном индексе на строку данных называется локатором строки. Структура локатора строк зависит от того, хранятся ли страницы данных в куче или в кластерной таблице. Для кучи локатор строки - это указатель на строку. Для кластеризованной таблицы указатель строки является ключом кластеризованного индекса.
Дипак Мишра
источник