Каковы различия между кластеризованным и некластеризованным индексом? - PullRequest
259 голосов
/ 18 сентября 2008

В чем различия между clustered и non-clustered index?

Ответы [ 12 ]

246 голосов
/ 18 сентября 2008

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

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

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

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

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

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

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

69 голосов
/ 18 сентября 2008

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

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

32 голосов
/ 18 сентября 2008

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

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

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

26 голосов
/ 10 февраля 2013

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

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

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

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

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

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

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

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

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

8 голосов
/ 18 сентября 2008

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

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

6 голосов
/ 18 сентября 2008

Плюсы:

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

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

Минусы:

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

5 голосов
/ 17 сентября 2013

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

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

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

5 голосов
/ 18 сентября 2008

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

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

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

5 голосов
/ 18 сентября 2008

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

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

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