Я имею ограниченную подверженность БД и использую только БД в качестве прикладного программиста. Я хочу знать о Clustered
и Non clustered indexes
. Я погуглил и нашел:
Кластерный индекс - это особый тип индекса, который изменяет порядок физического хранения записей в таблице. Поэтому таблица может иметь только один кластерный индекс. Конечные узлы кластерного индекса содержат страницы данных. Некластеризованный индекс - это особый тип индекса, в котором логический порядок индекса не соответствует физическому сохраненному порядку строк на диске. Конечный узел некластеризованного индекса не состоит из страниц данных. Вместо этого конечные узлы содержат строки индекса.
То, что я нашел в SO, было: Каковы различия между кластеризованным и некластеризованным индексом? ,
Может кто-нибудь объяснить это простым английским языком?
Кластерный индекс означает, что вы говорите базе данных хранить близкие значения, фактически близкие друг к другу на диске. Это дает преимущество быстрого сканирования / поиска записей, попадающих в некоторый диапазон значений кластеризованного индекса.
Например, у вас есть две таблицы, Клиент и Заказ:
Если вы хотите быстро получить все заказы одного конкретного клиента, вы можете создать кластерный индекс в столбце «CustomerID» таблицы «Заказы». Таким образом, записи с одним и тем же CustomerID будут физически храниться близко друг к другу на диске (кластеризованно), что ускоряет их поиск.
PS Индекс CustomerID, очевидно, будет не уникальным, поэтому вам нужно либо добавить второе поле для «унификации» индекса, либо позволить базе данных обработать это для вас, но это уже другая история.
Относительно нескольких индексов. Вы можете иметь только один кластеризованный индекс на таблицу, потому что это определяет, как физически организованы данные. Если вы хотите провести аналогию, представьте себе большую комнату со множеством столов. Вы можете либо поместить эти таблицы в несколько строк, либо собрать их все вместе, чтобы сформировать большой конференц-стол, но не в обоих направлениях одновременно. Таблица может иметь другие индексы, которые затем будут указывать на записи в кластерном индексе, которые, в свою очередь, в конечном итоге скажут, где найти фактические данные.
источник
XML
,VARCHAR(MAX)
илиVARBINARY(MAX)
. Обратите внимание, что обычно имеет смысл сначала кластеризовать поле даты , так как кластеризованный индекс наиболее эффективен для сканирования диапазона, который наиболее распространен для типов даты. YMMV.В хранилище, ориентированном на строки в SQL Server, как кластерные, так и некластерные индексы организованы в виде B-деревьев.
( Источник изображения )
Основное различие между кластеризованными и некластеризованными индексами состоит в том, что конечным уровнем кластеризованного индекса является таблица. Это имеет два значения.
Некластеризованные индексы могут также выполнить пункт 1, используя
INCLUDE
предложение (начиная с SQL Server 2005), чтобы явно включить все неключевые столбцы, но они являются вторичными представлениями, и всегда есть другая копия данных (сама таблица).Два индекса выше будут почти идентичны. С индексными страницами верхнего уровня, содержащими значения для ключевых столбцов,
A,B
и страницами конечного уровня, содержащимиA,B,C,D
Приведенная выше цитата из книг по SQL Server в Интернете вызывает много путаницы
На мой взгляд, это было бы гораздо лучше сформулировать как.
Онлайновая цитата из книг не является неправильной, но вы должны понимать, что «сортировка» как некластеризованных, так и кластеризованных индексов является логической, а не физической. Если вы читаете страницы на уровне листа, следуя связанному списку, и читаете строки на странице в порядке расположения слотов, то вы будете читать строки индекса в отсортированном порядке, но физически страницы могут быть не отсортированы. Обычно считается, что при кластеризованном индексе строки всегда физически хранятся на диске в том же порядке, что и ключ индекса, неверно.
Это было бы абсурдной реализацией. Например, если строка вставлена в середину таблицы 4 ГБ, SQL Server не нужно копировать 2 ГБ данных в файл, чтобы освободить место для вновь вставленной строки.
Вместо этого происходит разделение страницы. Каждая страница на уровне листьев как кластеризованных, так и некластеризованных индексов имеет адрес (
File:Page
) следующей и предыдущей страницы в порядке логического ключа. Эти страницы не обязательно должны быть смежными или в ключевом порядке.например, цепочка связанных страниц может быть
1:2000 <-> 1:157 <-> 1:7053
Когда происходит разделение страницы, новая страница выделяется из любой точки файловой группы (из смешанного экстента, для небольших таблиц, или из непустого единообразного экстента, принадлежащего этому объекту, или из вновь выделенного единообразного экстента). Это может даже не быть в том же файле, если файловая группа содержит больше чем один.
Степень, в которой логический порядок и смежность отличаются от идеализированной физической версии, является степенью логической фрагментации.
Во вновь созданной базе данных с одним файлом я запустил следующее.
Затем проверил макет страницы с помощью
Результаты были повсюду. Первая строка в ключевом порядке (со значением 1 - выделено стрелкой ниже) была почти на последней физической странице.
Фрагментация может быть уменьшена или удалена путем перестройки или реорганизации индекса, чтобы увеличить корреляцию между логическим порядком и физическим порядком.
После запуска
Я получил следующее
Если таблица не имеет кластеризованного индекса, она называется кучей.
Некластеризованные индексы могут быть построены либо на куче, либо на кластерном индексе. Они всегда содержат локатор строк обратно к базовой таблице. В случае кучи это физический идентификатор строки (rid) и состоит из трех компонентов (File: Page: Slot). В случае кластеризованного индекса указатель строки является логическим (ключ кластеризованного индекса).
В последнем случае, если некластеризованный индекс уже содержит столбцы ключа CI либо в виде столбцов ключа NCI, либо
INCLUDE
столбца -d, то ничего не добавляется. В противном случае отсутствующие ключевые столбцы CI автоматически добавляются в NCI.SQL Server всегда гарантирует, что ключевые столбцы уникальны для обоих типов индекса. Механизм, в котором это применяется для индексов, не объявленных как уникальные, отличается между двумя типами индексов.
Кластерные индексы
uniquifier
добавляются для любых строк с ключевыми значениями, которые дублируют существующую строку. Это просто восходящее целое число.Для некластеризованных индексов, не объявленных как уникальные, SQL Server автоматически добавляет локатор строк в ключ некластеризованного индекса. Это относится ко всем строкам, а не только к тем, которые на самом деле являются дубликатами.
Кластеризованная и некластерная номенклатура также используется для индексов хранилища столбцов. В статье Усовершенствования столбцов Stores SQL Server состояний
источник
SQL Server 2014
. Я получаю95%
фрагментацию индекса после начальной вставки. Послеindex rebuild
того, как фрагментация была0%
и значения были упорядочены. Мне интересно, мы можем так сказатьThe only time the data rows in a table are stored in sorted order is when its clustered index fragmentation is 0
?Я понимаю, что это очень старый вопрос, но я решил предложить аналогию, чтобы проиллюстрировать прекрасные ответы выше.
КЛАСТЕРНЫЙ ИНДЕКС
Если вы войдете в публичную библиотеку, вы обнаружите, что все книги расположены в определенном порядке (скорее всего, десятичная система Дьюи, или DDS). Это соответствует «кластерному указателю» книг. Если бы DDS # для нужной вам книги был
005.7565 F736s
, вы бы начали с поиска ряда книжных полок, которые помечены001-099
или что-то в этом роде. (Этот знак конечного колпачка в конце стека соответствует «промежуточному узлу» в индексе.) В конце концов, вы будете переходить к определенной полке с надписью005.7450 - 005.7600
, затем будете сканировать, пока не найдете книгу с указанным DDS #, и в В этот момент вы нашли свою книгу.НЕКЛАСТЕРНЫЙ ИНДЕКС
Но если вы не вошли в библиотеку с запоминанием DDS # вашей книги, вам понадобится второй индекс, чтобы помочь вам. В старину перед библиотекой находилось замечательное бюро ящиков, известное как «Каталог карт». В нем были тысячи карточек 3х5 - по одной на каждую книгу, отсортированные по алфавиту (возможно, по названию). Это соответствует «некластеризованному индексу» . Эти каталоги карт были организованы в иерархическую структуру, так что каждый ящик был помечен диапазоном карт, которые он содержал (
Ka - Kl
например, «промежуточный узел»). Еще раз, вы будете углубляться в детали, пока не найдете свою книгу, но в этом случае, как только вы ее найдете (т. Е. «Листовой узел»), у вас нет самой книги,индексе (DDS #), с помощью которого вы можете найти фактическую книгу в кластерном индексе.Конечно, ничто не помешает библиотекарю фотокопировать все карточки и сортировать их в другом порядке в отдельном каталоге карточек. (Обычно таких каталогов было как минимум два: один отсортирован по имени автора, а другой по названию.) В принципе, вы можете иметь столько «некластеризованных» индексов, сколько захотите.
источник
Ниже приведены некоторые характеристики кластеризованных и некластеризованных индексов:
Кластерные индексы
create Index index_name(col1, col2, col.....)
.Некластеризованные индексы
источник
Очень простое нетехническое правило заключается в том, что кластерные индексы обычно используются для вашего первичного ключа (или, по крайней мере, уникального столбца), а некластеризованные используются для других ситуаций (возможно, внешнего ключа). , Действительно, SQL Server по умолчанию создаст кластерный индекс для столбцов первичного ключа. Как вы уже узнали, кластеризованный индекс относится к способу физической сортировки данных на диске, что означает, что это хороший универсальный выбор для большинства ситуаций.
источник
Кластерный индекс
Кластерный индекс определяет физический порядок данных в таблице. По этой причине таблица имеет только 1 кластерный индекс.
« словарь » Нет необходимости в каком-либо другом индексе, его уже индекс по словам
Некластерный индекс
Некластеризованный индекс аналогичен индексу в Книге. Данные хранятся в одном месте. Индекс хранится в другом месте, и у индекса есть указатели на место хранения данных. По этой причине таблица имеет более 1 некластеризованного индекса.
источник
Кластерный индекс
Кластерные индексы сортируют и сохраняют строки данных в таблице или представлении на основе значений их ключей. Это столбцы, включенные в определение индекса. В таблице может быть только один кластеризованный индекс, поскольку сами строки данных могут быть отсортированы только в одном порядке.
Единственный раз, когда строки данных в таблице хранятся в отсортированном порядке, это когда таблица содержит кластерный индекс. Когда таблица имеет кластеризованный индекс, она называется кластерной таблицей. Если таблица не имеет кластеризованного индекса, ее строки данных хранятся в неупорядоченной структуре, называемой кучей.
Некластеризованный
Некластеризованные индексы имеют структуру, отдельную от строк данных. Некластеризованный индекс содержит значения ключа некластеризованного индекса, и каждая запись значения ключа имеет указатель на строку данных, которая содержит значение ключа. Указатель от строки индекса в некластеризованном индексе к строке данных называется локатором строки. Структура локатора строк зависит от того, хранятся ли страницы данных в куче или в кластерной таблице. Для кучи локатор строки - это указатель на строку. Для кластеризованной таблицы указатель строки является ключом кластеризованного индекса.
Вы можете добавить неключевые столбцы на конечный уровень некластеризованного индекса, чтобы обойти существующие ограничения ключа индекса и выполнить полностью покрытые, проиндексированные запросы. Для получения дополнительной информации см. Создание индексов с включенными столбцами. Подробные сведения об ограничениях ключа индекса см. В разделе Характеристики максимальной емкости для SQL Server.
Ссылка: https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described
источник
Позвольте мне предложить определение учебника по «индексу кластеризации», которое взято из 15.6.1 из Системы баз данных: Полная книга :
Чтобы понять определение, давайте взглянем на пример 15.10, представленный в учебнике:
Обратите внимание, что определение не требует, чтобы блоки данных были смежными на диске; он только говорит, что кортежи с ключом поиска упакованы в как можно меньше блоков данных.
Родственное понятие - кластерное отношение . Отношение «кластеризовано», если его кортежи упакованы примерно в несколько блоков, которые могут содержать эти кортежи. Другими словами, с точки зрения дискового блока, если он содержит кортежи из разных отношений, то эти отношения не могут быть кластеризованы (т. Е. Существует более упакованный способ хранения такого отношения путем замены кортежей этого отношения из других дисковых блоков с помощью кортежи не принадлежат отношению в текущем блоке диска). Понятно, что
R(a,b)
в приведенном выше примере это кластеризация.Чтобы соединить две концепции вместе, кластеризованное отношение может иметь индекс кластеризации и индекс некластеризации. Однако для некластеризованного отношения кластеризованный индекс невозможен, если индекс не построен поверх первичного ключа отношения.
«Кластер» как слово является спамом на всех уровнях абстракции стороны хранения базы данных (три уровня абстракции: кортежи, блоки, файл). Концепция под названием « кластерный файл» », которая описывает, содержит ли файл (абстракция для группы блоков (один или несколько дисковых блоков)) кортежи из одного отношения или разных отношений. Это не относится к концепции индекса кластеризации, как на уровне файлов.
Однако некоторым учебным материалам нравится определять индекс кластеризации на основе определения кластеризованного файла. Эти два типа определений одинаковы на уровне кластеризованных отношений, независимо от того, определяют ли они кластеризованные отношения в терминах блока данных или файла. По ссылке в этом абзаце
Последовательное хранение кортежей - это то же самое, что сказать, что «кортежи упакованы примерно в несколько блоков, которые могут содержать эти кортежи» (с небольшой разницей, когда один говорит о файле, а другой говорит о диске). Это потому, что последовательное хранение кортежей - это способ достичь «упакованного в примерно столько блоков, сколько может вместить эти кортежи».
источник
Кластерный индекс: Кластерный ограничение первичного ключа автоматически создает кластерный индекс, если в таблице еще нет кластеризованного индекса. Фактические данные кластерного индекса могут храниться на уровне листа индекса.
Некластеризованный индекс: фактические данные некластеризованного индекса непосредственно не обнаруживаются на конечном узле, вместо этого необходимо выполнить дополнительный шаг для поиска, поскольку в нем есть только значения локаторов строк, указывающие на фактические данные. Некластерный индекс не может быть отсортирован как кластерный индекс. В таблице может быть несколько некластеризованных индексов, на самом деле это зависит от используемой нами версии сервера SQL. В основном Sql server 2005 допускает 249 некластеризованных индексов, а для вышеприведенных версий, таких как 2008, 2016, он допускает 999 некластеризованных индексов на таблицу.
источник
Кластерный индекс - кластерный индекс определяет порядок , в котором данные физически хранятся в таблице. Табличные данные могут быть отсортированы только одним способом, поэтому в таблице может быть только один кластеризованный индекс. В SQL Server ограничение первичного ключа автоматически создает кластеризованный индекс для этого конкретного столбца.
Некластерный индекс- Некластеризованный индекс не сортирует физические данные внутри таблицы. Фактически некластеризованный индекс хранится в одном месте, а данные таблицы хранятся в другом месте. Это похоже на учебник, где содержание книги находится в одном месте, а указатель - в другом. Это позволяет использовать более одного некластеризованного индекса на таблицу. Здесь важно упомянуть, что внутри таблицы данные будут отсортированы по кластерному индексу. Однако внутри некластеризованного индекса данные хранятся в указанном порядке. Индекс содержит значения столбцов, для которых создается индекс, и адрес записи, которой принадлежит значение столбца. Когда выдается запрос к столбцу, для которого создается индекс, база данных сначала переходит к индексу и ищет адрес соответствующей строки в таблице. Затем он перейдет к этому адресу строки и получит другие значения столбца. Именно благодаря этому дополнительному шагу некластеризованные индексы работают медленнее, чем кластеризованные индексы.
Различия между кластерным и некластеризованным индексом
Для получения дополнительной информации обратитесь к этой статье.
источник