Путаница между кластеризованным и некластеризованным индексом. Содержит 5 сомнений

Работают ли кластеризованные и некластеризованные индексы на B-Tree? Я читал, что кластеризованные индексы влияют на то, как данные физически хранятся в таблице, тогда как с некластеризованными индексами создается отдельная копия столбца, которая хранится в отсортированном порядке. Кроме того, Sql Server по умолчанию создает кластерные индексы по первичному ключу.

Означает ли это:

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

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

3) Есть только 2 типа индексов? Если да, то что такое растровые индексы? Кажется, я не могу найти такой тип индекса в Sql Server Management Studio, но в моей книге по хранению данных все эти типы упоминаются.

4) Эффективно ли создание кластеризованного или некластеризованного индекса по первичному ключу?

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

Заранее спасибо :)


person TCM    schedule 03.09.2010    source источник


Ответы (1)


Индексы — это структуры, хранящиеся отдельно от реальных страниц данных и просто содержащие указатели на страницы данных. В SQL Server индексы представляют собой B-деревья.

Кластерные индексы сортируют и сохраняют страницы данных в таблице в соответствии со столбцами, определенными для индекса. В SQL Server 2005 вы можете добавлять в индекс дополнительные столбцы, поэтому это не должно быть проблемой, если у вас есть составные первичные ключи. Вы можете думать о кластеризованном индексе как о наборе картотеки с папками. В первом розыгрыше у вас есть документы, начинающиеся с A, а в первой папке этого розыгрыша у вас могут быть документы, начинающиеся с AA до AC и так далее. Чтобы найти «Паук», вы можете сразу перейти к рисованию S и найти папку, содержащую «SP», и быстро найти то, что вы ищете. Но очевидно, что если вы физически отсортируете все документы по одному индексу, то вы не сможете физически отсортировать тот же набор документов по другому индексу. Следовательно, только один кластеризованный индекс на таблицу.

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

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

  2. В вашей книге будут упомянуты все теоретические типы индексов. Растровые индексы полезны в приложениях для хранения данных или для данных, которые имеют несколько различных значений, таких как дни недели и т. д. Поэтому они обычно не используются в вашей базовой СУБД. Я знаю, что у Oracle есть некоторые реализации, но я мало что об этом знаю.

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

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

person Vincent Ramdhanie    schedule 03.09.2010
comment
В интервью интервьюер спросил меня, почему некластеризованное индексирование не занимает места на диске? Не знаю, была ли это его уловка. Не могли бы вы пролить свет на эту концепцию. заранее спасибо - person Nithin Gangadharan; 24.05.2014
comment
@NithinGangadharan, потому что кластеризованный индекс по-прежнему хранится в B-дереве и имеет промежуточные уровни, для которых требуется место. Наверное, в этом был смысл. - person levi; 15.04.2015
comment
@levi большое спасибо за ваш ответ. То есть вы считаете, что даже некластерный индекс занимает место, я прав? но интервьюер постоянно отвергал мой ответ, поэтому я в замешательстве. Возможно, это просто уловка с его стороны. - person Nithin Gangadharan; 27.04.2015
comment
Оба они требуют места. В случае некластеризованного дело обстоит проще (он просто хранится в отдельной структуре, которая требует места), но в случае кластеризованного индекса (дерево B+) дополнительно к самим табличным данным (которые являются узлами листового уровня для дерева B+) есть промежуточные узлы, которые относятся к узлам следующего или листового уровня. Итак, им обоим нужно место, можно сказать, что Clustered занимает меньше. - person levi; 28.04.2015