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



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

727   10  

10 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

плюсы:

кластеризованные индексы отлично работают для диапазонов (например, select * from my_table where my_key between @min and @max)

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

плюсы:

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.