Что означает это предложение: кластеризованные индексы физически хранятся в таблице? - PullRequest
15 голосов
/ 15 февраля 2010

Как кластерные индексы хранятся на жестком диске? Каков логический порядок?

Как работают некластеризованные индексы?

Ответы [ 6 ]

21 голосов
/ 15 февраля 2010

Это означает, что данные в таблице хранятся в B-Tree в соответствии с порядком CLUSTERED PRIMARY KEY (или столбцами кластеризации).

Это имя, на мой взгляд, немного сбивает с толку. Та же самая концепция в Oracle называется index-organized table, что я считаю гораздо более наглядным.

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

«Кластерный индекс» - это сама таблица; «некластеризованный» индекс - это упорядоченная копия некоторых столбцов таблицы.

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

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

Некластеризованная таблица

id   col1   value
--   --     --
1    1      Data 1
6    1      Data 6
3    1      Data 3
7    2      Data 7
9    2      Data 9
5    2      Data 5

Стол не заказан.

Кластерный стол

id   col1   value
--   --     --
1    1      Data 1
3    1      Data 3
5    2      Data 5
6    1      Data 6
7    2      Data 7
9    2      Data 9

Стол заказан на id.

Кластерная таблица со вторичным индексом

Table                      Index
id   col1   value          col1   id
--   --     --             --     --
1    1      Data 1         1      1
3    1      Data 3         1      3
5    2      Data 5         1      6
6    1      Data 6         2      5
7    2      Data 7         2      7
9    2      Data 9         2      9

Стол заказан на id, индекс упорядочен на (col1, id)

4 голосов
/ 15 февраля 2010

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

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

3 голосов
/ 15 февраля 2010

Хранилище кластерного индекса

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

Концепция

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

Таким образом, логически кластерный индекс (или «организованная по индексу таблица» в Oracle) - это ваши данные, но отсортированные. Физически, листовые узлы B-дерева содержат все данные вашей таблицы в отсортированном порядке. Это действительно полезно, когда вы сканируете данные в своей таблице в непрерывном диапазоне, таком как диапазон дат.

Еще одна важная вещь о кластеризованных индексах (по крайней мере, в SQL Server) заключается в том, что столбцы кластеризации (то есть столбцы, составляющие порядок сортировки кластерного индекса) включены в конце каждого некластеризованного индекса, определенного вами в Таблица. Это делает поиск для ваших столбцов кластеризации очень быстрым, и это часто очень желательно в базах данных OLAP.

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

Ваш стол может храниться только в одном физическом порядке. Но в определенные моменты вам нужно искать данные другими способами. Для этих сценариев вы используете некластеризованный индекс. Это также реализовано в виде B-дерева, но оно не имеет никакого отношения к порядку данных вашей таблицы, как это делает кластерный индекс. Это означает, что если вам нужны данные из вашей таблицы, которые не включены в некластеризованный индекс, SQL Server должен будет физически просмотреть данные в вашей таблице, чтобы получить то, что вы хотите. Это еще одна операция, и для многих запросов она может быть дорогостоящей и является ключевым соображением при оптимизации ваших таблиц.

Слово

Вы могли бы написать книгу об этом материале. У многих есть. Если я еще не скучал до смерти, загляните на страницу B-Tree в Википедии. Начни там. Если вы все еще (действительно) заинтересованы, я предлагаю на самом деле запрограммировать простое B-Tree, чтобы вы могли видеть, что с этим связано. И, если вы хотите узнать еще более подробные сведения о том, как точно хранит все это в SQL Server, посмотрите Inside SQL Server Калена Делани: Механизм хранения . Является ли все это обучение излишним? Это вам решать. Но чем больше вы изучаете это, тем более комфортно вам будет заниматься разработкой БД и тем быстрее будут работать ваши системы. Я обещаю.

2 голосов
/ 15 февраля 2010

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

Быстрый пример: таблица с ID (первичный ключ), FirstName, LastName и Car, содержащая трех человек: 0 = Стиг (Llana), 1 = Джереми Кларксон (DB9), 2 = Ричард Хаммонд (911), 3 = Джеймс Мэй (Lambo) и кластеризованный индекс на LastName и некластеризованный индекс на Car будут хранить фактические строки данных в таблице в таком физическом порядке на диске:

ID FirstName LastName Car
1  Jeremy    Clarkson DB9
2  Richard   Hammond  911
3  James     May      Lambo
0  The       Stig     Llana

Некластеризованный индекс также будет хранить что-то вроде:

Car   ID
911   2
DB9   1
Lambo 3
Llana 0
0 голосов
/ 04 марта 2013

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

0 голосов
/ 15 февраля 2010

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

...