Что на самом деле означает Кластерный и Некластерный индекс?

У меня ограниченный доступ к БД, и я использовал только БД в качестве прикладного программиста. Я хочу знать о Clustered и Non clustered indexes. Я погуглил и нашел:

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

То, что я нашел в SO, было Каковы различия между кластеризованным и некластеризованным индексом? .

Может кто-нибудь объяснить это на простом английском языке?

P.K
8537 репутация

9 ответов


  • 828 рейтинг

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

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

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

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

    ответ дан Shiraz Bhaiji, с репутацией 47136, 9.08.2009
  • 535 рейтинг

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

    Например, у вас есть две таблицы, Клиент и Заказ:

    Customer
    ----------
    ID
    Name
    Address
    
    Order
    ----------
    ID
    CustomerID
    Price
    

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

    П. С. Индекс CustomerID, очевидно, будет не уникальным, поэтому вам нужно либо добавить второе поле, чтобы «унифицировать» индекс, либо позволить базе данных обработать это для вас, но это уже другая история.

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

    ответ дан does_not_exist, с репутацией , 9.08.2009
  • 224 рейтинг

    В хранилище, ориентированном на строки в SQL Server, как кластерные, так и некластерные индексы организованы в виде B-деревьев.

    enter image description here

    ( Источник изображения )

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

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

    Некластеризованные индексы также могут выполнить пункт 1, используя предложение INCLUDE (начиная с SQL Server 2005) для явного включения всех неключевых столбцов, но они являются вторичными представлениями, и всегда есть другая копия данных (сама таблица).

    CREATE TABLE T
    (
    A INT,
    B INT,
    C INT,
    D INT
    )
    
    CREATE UNIQUE CLUSTERED INDEX ci ON T(A,B)
    CREATE UNIQUE NONCLUSTERED INDEX nci ON T(A,B) INCLUDE (C,D)
    

    Два индекса выше будут почти идентичны. С индексными страницами верхнего уровня, содержащими значения для ключевых столбцов A,B, и страницами конечного уровня, содержащими A,B,C,D

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

    Приведенная выше цитата из книг по SQL Server в Интернете вызывает много путаницы.

    На мой взгляд, это было бы гораздо лучше, как.

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

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

    Это было бы абсурдной реализацией. Например, если строка вставлена ​​в середину таблицы 4 ГБ, SQL Server , а не , должен скопировать 2 ГБ данных в файл, чтобы освободить место для вновь вставленной строки.

    Вместо этого происходит разделение страницы. Каждая страница на уровне листьев как кластеризованных, так и некластеризованных индексов имеет адрес (File:Page) следующей и предыдущей страниц в порядке логического ключа. Эти страницы не обязательно должны быть смежными или в ключевом порядке.

    эл. г. цепочка связанных страниц может быть 1:2000 <-> 1:157 <-> 1:7053

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

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

    Во вновь созданной базе данных с одним файлом я запустил следующее.

    CREATE TABLE T
      (
         X TINYINT NOT NULL,
         Y CHAR(3000) NULL
      );
    
    CREATE CLUSTERED INDEX ix
      ON T(X);
    
    GO
    
    --Insert 100 rows with values 1 - 100 in random order
    DECLARE @C1 AS CURSOR,
            @X  AS INT
    
    SET @C1 = CURSOR FAST_FORWARD
    FOR SELECT number
        FROM   master..spt_values
        WHERE  type = 'P'
               AND number BETWEEN 1 AND 100
        ORDER  BY CRYPT_GEN_RANDOM(4)
    
    OPEN @C1;
    
    FETCH NEXT FROM @C1 INTO @X;
    
    WHILE @@FETCH_STATUS = 0
      BEGIN
          INSERT INTO T (X)
          VALUES        (@X);
    
          FETCH NEXT FROM @C1 INTO @X;
      END
    

    Затем проверил макет страницы с

    SELECT page_id,
           X,
           geometry::Point(page_id, X, 0).STBuffer(1)
    FROM   T
           CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
    ORDER  BY page_id
    

    Результаты были повсюду. Первая строка в ключевом порядке (со значением 1 - выделено стрелкой ниже) была почти на последней физической странице.

    enter image description here

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

    После запуска

    ALTER INDEX ix ON T REBUILD;
    

    Я получил следующее

    enter image description here

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

    Некластеризованные индексы могут быть построены либо на куче, либо на кластерном индексе. Они всегда содержат локатор строк обратно к базовой таблице. В случае кучи это физический идентификатор строки (rid) и состоит из трех компонентов (File: Page: Slot). В случае кластеризованного индекса указатель строки является логическим (ключ кластеризованного индекса).

    В последнем случае, если некластеризованный индекс уже естественным образом включает ключевые столбцы CI либо как ключевые столбцы NCI, либо как INCLUDE -d столбцы, то ничего не добавляется. В противном случае отсутствующие ключевые столбцы CI автоматически добавляются в NCI.

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

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

    Для некластеризованных индексов, не объявленных как уникальные, SQL Server автоматически добавляет локатор строк в ключ некластеризованного индекса. Это относится ко всем строкам, а не только к тем, которые на самом деле являются дубликатами.

    Кластерная или некластерная номенклатура также используется для индексов хранилища столбцов. Статья Усовершенствования хранилищ столбцов SQL Server состояний

    Хотя данные хранилища столбцов на самом деле не «кластеризованы» ни по одному ключу, мы решил сохранить традиционное соглашение SQL Server о ссылках к первичному индексу как кластеризованному индексу.

    ответ дан Martin Smith, с репутацией 333672, 28.06.2014
  • 82 рейтинг

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

    КЛАСТЕРНЫЙ ИНДЕКС

    Если вы войдете в публичную библиотеку, вы обнаружите, что все книги расположены в определенном порядке (скорее всего, десятичная система Дьюи, или DDS). Это соответствует «кластерному индексу» книг. Если бы DDS # для нужной вам книги был 005.7565 F736s, вы бы начали с поиска строки книжных полок с маркировкой 001-099 или чего-то подобного. (Этот знак endcap в конце стека соответствует «промежуточному узлу» в индексе. ) В конце концов, вы должны были перейти к определенной полке, обозначенной 005.7450 - 005.7600, затем сканировать, пока не найдете книгу с указанным номером DDS #, и в этот момент вы не найдете свою книгу.

    НЕКЛАСТЕРНЫЙ ИНДЕКС

    Но если вы не вошли в библиотеку с запомненным DDS # вашей книги, то вам понадобится второй индекс, чтобы помочь вам. В старину перед библиотекой находилось замечательное бюро ящиков, известное как «Каталог карт». В нем были тысячи карточек 3х5 - по одной на каждую книгу, отсортированные в алфавитном порядке (возможно, по названию). Это соответствует «некластеризованному индексу» . Эти каталоги карточек были организованы в иерархическую структуру, так что каждый ящик был отмечен диапазоном карточек, которые он содержал (например, Ka - Kl; i. е. «промежуточный узел»). Еще раз, вы будете углубляться до тех пор, пока не найдете свою книгу, но в этом случае , как только найдете ее (i. например, «листовой узел»), у вас есть не сама книга, а просто карта с номером индекса 99868408 (номер DDS), с помощью которого вы можете найти фактическую книгу в кластерном индексе.

    Конечно, ничто не помешает библиотекарю фотокопировать все карточки и сортировать их в другом порядке в отдельном карточном каталоге. (Обычно таких каталогов было как минимум два: один отсортирован по имени автора, а другой по названию. В принципе, вы можете иметь столько «некластеризованных» индексов, сколько захотите.

    ответ дан kmote, с репутацией 10297, 26.10.2016
  • 62 рейтинг

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

    Кластерные индексы

    1. Кластерные индексы - это индексы, которые однозначно идентифицируют строки в таблице SQL.
    2. Каждая таблица может иметь ровно один кластерный индекс.
    3. Вы можете создать кластерный индекс, который охватывает более одного столбца. Например: create Index index_name(col1, col2, col.....).
    4. По умолчанию столбец с первичным ключом уже имеет кластеризованный индекс.

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

    1. Некластеризованные индексы похожи на простые индексы. Они просто используются для быстрого поиска данных. Не обязательно иметь уникальные данные.
    ответ дан Anirudh Sood, с репутацией 1072, 21.01.2013
  • 42 рейтинг

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

    ответ дан Dan Diplo, с репутацией 21828, 9.08.2009
  • 4 рейтинг

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

    Кластерный индекс определяет физический порядок данных в таблице. По этой причине таблица имеет только 1 кластерный индекс.

    как "словарь" Нет необходимости в каком-либо другом индексе, его уже индекс по словам

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

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

    , например, «Книга химии» при взгляде, есть отдельный указатель для указания местоположения главы, а у «КОНЦА» есть еще один указатель, указывающий общее местоположение СЛОВ

    ответ дан abdul rehman kk, с репутацией 101, 21.01.2018
  • 3 рейтинг

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

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

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

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

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

    Можно добавить неключевые столбцы на конечный уровень некластеризованного индекса, чтобы обойти существующие ограничения ключа индекса и выполнить полностью покрытые, проиндексированные запросы. Для получения дополнительной информации см. Создание индексов с включенными столбцами. Подробные сведения об ограничениях ключа индекса см. В разделе Характеристики максимальной емкости для SQL Server.

    Ссылка: https: // docs. Microsoft. com / en-us / sql / реляционные базы данных / индексы / кластеризованные и некластеризованные индексы, описанные

    ответ дан marvelTracker, с репутацией 1781, 28.08.2017
  • 0 рейтинг

    Если файл, содержащий записи, упорядочен последовательно, индекс кластеризации - это индекс, ключ поиска которого также определяет последовательный порядок файла. Индексы кластеризации также называют первичными индексами; может показаться, что термин первичный индекс обозначает индекс первичного ключа, но такие индексы фактически могут быть построены на любом поисковом ключе. Ключ поиска индекса кластеризации часто является первичным ключом, хотя это не обязательно так. Индексы, в ключе поиска которых указан порядок, отличный от последовательного порядка файла, называются некластеризованными индексами или вторичными индексами. Термины « кластеризованный » и « некластеризованный » часто используются вместо « кластеризация » и « некластеризация ».

    ответ дан hechen0, с репутацией 311, 12.07.2018