Каковы различия между а clustered
и а non-clustered index
?
Каковы различия между а clustered
и а non-clustered index
?
Ответы:
Кластерный индекс
Некластерный индекс
Оба типа индекса улучшат производительность при выборе данных с полями, которые используют индекс, но замедляют операции обновления и вставки.
Из-за более медленной вставки и обновления кластеризованные индексы должны быть установлены в поле, которое обычно является инкрементным, то есть Id или Timestamp.
SQL Server обычно использует индекс только в том случае, если его селективность превышает 95%.
Кластерные индексы физически упорядочивают данные на диске. Это означает, что для индекса не требуется никаких дополнительных данных, но может быть только один кластерный индекс (очевидно). Доступ к данным с использованием кластерного индекса самый быстрый.
Все остальные индексы должны быть некластеризованными. Некластеризованный индекс содержит дубликаты данных из проиндексированных столбцов, упорядоченные вместе с указателями на фактические строки данных (указатели на кластеризованный индекс, если он есть). Это означает, что доступ к данным через некластеризованный индекс должен проходить через дополнительный уровень косвенности. Однако, если вы выберете только те данные, которые доступны в индексированных столбцах, вы можете получить данные обратно непосредственно из дублированных индексных данных (поэтому рекомендуется выбирать только те столбцы, которые вам нужны, а не использовать *)
Кластерные индексы хранятся физически в таблице. Это означает, что они самые быстрые, и вы можете иметь только один кластеризованный индекс на таблицу.
Некластеризованные индексы хранятся отдельно, и вы можете иметь сколько угодно.
Лучший вариант - установить кластерный индекс для наиболее часто используемого уникального столбца, обычно для PK. У вас всегда должен быть хорошо выбранный кластеризованный индекс в ваших таблицах, если только нет веских причин - не можете придумать ни одного, но, эй, он может быть там - потому что этого не происходит.
Помимо этих различий, вы должны знать, что когда таблица некластеризована (когда таблица не имеет кластеризованного индекса), файлы данных не упорядочиваются, и в качестве структуры данных используется структура данных Heap.
Плюсы:
Кластерные индексы отлично работают для диапазонов (например, выберите * из my_table, где my_key между @min и @max)
В некоторых случаях СУБД не придется выполнять работу по сортировке, если вы используете оператор orderby.
Минусы:
Кластерные индексы могут замедлять вставки, поскольку физические макеты записей должны быть изменены по мере ввода записей, если новые ключи расположены не в последовательном порядке.
Кластерный индекс - это, по сути, отсортированная копия данных в индексированных столбцах.
Основное преимущество кластеризованного индекса состоит в том, что когда ваш запрос (поиск) находит данные в индексе, то для извлечения этих данных не требуется никакого дополнительного ввода-вывода.
Затраты на обслуживание кластеризованного индекса, особенно в часто обновляемой таблице, могут привести к снижению производительности, и по этой причине может оказаться предпочтительным создание некластеризованного индекса.
Индексированная база данных состоит из двух частей: набора физических записей, которые расположены в произвольном порядке, и набора индексов, которые идентифицируют последовательность, в которой следует читать записи, чтобы получить результат, отсортированный по некоторому критерию. Если между физическим расположением и индексом нет корреляции, то для считывания всех записей по порядку может потребоваться выполнение множества независимых операций чтения одной записи. Поскольку база данных может считывать десятки последовательных записей за меньшее время, чем требуется для чтения двух непоследовательных записей, производительность может быть улучшена, если записи, которые являются последовательными в индексе, также последовательно хранятся на диске.
Например, если начать с пустой некластеризованной базы данных и добавить 10 000 записей в произвольной последовательности, записи, вероятно, будут добавлены в конце в том порядке, в котором они были добавлены. Для считывания базы данных по порядку по индексу потребуется 10 000 операций чтения одной записи. Однако если использовать кластерную базу данных, при добавлении каждой записи система может проверить, была ли предыдущая запись сохранена сама по себе; если он обнаружит, что это так, он может записать эту запись вместе с новой в конце базы данных. Затем он может посмотреть на физическую запись перед слотами, в которых находились перемещенные записи, и посмотреть, была ли запись, которая за ней следовала, сохранена сама собой. Если он обнаружит, что это так, он может переместить эту запись в это место. Использование такого подхода приведет к тому, что многие записи будут сгруппированы в пары,
В действительности кластерные базы данных используют более сложные алгоритмы, чем этот. Однако следует отметить, что существует компромисс между временем, необходимым для обновления базы данных, и временем, необходимым для ее последовательного чтения. Обслуживание кластерной базы данных значительно увеличит объем работы, необходимой для добавления, удаления или обновления записей любым способом, который может повлиять на последовательность сортировки. Если база данных будет считываться последовательно намного чаще, чем она будет обновляться, кластеризация может быть большим выигрышем. Если оно будет обновляться часто, но редко будет считываться последовательно, кластеризация может сильно снизить производительность, особенно если последовательность, в которой элементы добавляются в базу данных, не зависит от порядка их сортировки в отношении кластеризованного индекса.
Кластерный индекс фактически описывает порядок, в котором записи физически хранятся на диске, поэтому у вас может быть только один.
Некластеризованный индекс определяет логический порядок, который не соответствует физическому порядку на диске.
Вы могли пройти часть теории из приведенных выше постов:
-Кластерный индекс, как мы видим, указывает непосредственно на запись, то есть непосредственно, поэтому поиск занимает меньше времени. Кроме того, для хранения индекса не потребуется дополнительная память / пространство
-В то время как в некластеризованном индексе он косвенно указывает на кластеризованный индекс, тогда он получит доступ к фактической записи, поскольку из-за его косвенного характера потребуется немного больше времени для доступа. Также ему требуется собственная память / пространство для хранения индекс
// Скопировано из MSDN, вторая точка некластеризованного индекса четко не упоминается в других ответах.
кластерный
Некластеризованный