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

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

13 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Плюсы:

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

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

Минусы:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Некластеризованные индексы медленнее извлекают данные и быстрее вставляют и обновляют.

  • Таблица может иметь несколько некластеризованных индексов.

  • Требуется дополнительное пространство для хранения логической структуры.

  • Не влияет на порядок хранения данных на диске.

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

кластерный

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

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

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