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

StackOverflow https://stackoverflow.com/questions/91688

Вопрос

В чем разница между clustered и еще non-clustered index?

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Плюсы:

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

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

Минусы:

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

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

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

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

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

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

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

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

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

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

Сгруппированный

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

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

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

Возможно, вы уже ознакомились с теоретической частью из вышеприведенных постов:

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

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

enter image description here

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top