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

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

10 ответов


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

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

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

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

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

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

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


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

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


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

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

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


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

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

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

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

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

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

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

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

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


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

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


плюсы:

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

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

плюсы:

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


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

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


кластеризованный индекс по существу представляет собой отсортированную копию данных в индексированных столбцах.

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

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


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

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

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