Что означает это предложение: кластерные индексы хранятся физически на столе?
Как кластеризованные индексы хранятся на жестком диске? Что такое логический порядок?
Как работают некластеризованные индексы?
Ответы
Ответ 1
Это означает, что данные в таблице хранятся в 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)
Ответ 2
Для некластеризованных индексов создается отдельный файл, в котором хранятся только поля индекса, в которых есть записи, помещенные в порядок логического индекса. Для кластерного индекса нет отдельного файла - данные из самой таблицы (все поля) помещаются в логический порядок индекса.
Это ускоряет поиск индекса (хотя он действительно лучший из индексов, таких как даты, когда вы будете искать диапазон). Это также делает вставки довольно медленными, запись будет вставлена посередине.
Ответ 3
Это означает, что кластеризованный индекс определяет физический порядок, в котором фактически хранятся записи в таблице. Некластеризованные индексы - это просто списки значений ключей, хранящихся отдельно, которые позволяют быстро выполнять поиск в других порядках, чем кластерный/физический порядок.
Быстрый пример: таблица с ID
(первичный ключ), FirstName
, LastName
и Car
, содержащий три человека: 0 = Stig (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
Ответ 4
Кластеризованное хранилище индексов
Кластерные индексы в основном работают точно так же, как работают все другие индексы - они хранятся внутри варианта struture, называемого B-Tree. Они хранятся в одних и тех же файлах с теми же форматами, что и все остальные таблицы в SQL Server.
Концепция
Вернитесь назад и подумайте о данных, которые вы индексируете. (Я хочу, чтобы вы подумали о книге в этой аналогии). Что делать, если в дополнение к индексам в конце книги вы также заказали данные внутри книги? Вы могли быстрее искать информацию. Возьмем, к примеру, телефонную книгу, где все данные упорядочены по фамилии и имени. Вам не нужно заходить в телефонную книгу, чтобы найти номер. Сравните это с книгой истории, где вам нужно перейти к индексу в конце книги, чтобы найти то, что вы хотите.
Итак, логически, кластеризованный индекс (или "упорядоченная по индексу таблица" в Oracle) - это ваши данные, но отсортированные. Физически узлы листа B-дерева содержат все ваши данные таблицы в отсортированном порядке. Это действительно полезно при сканировании данных в вашей таблице на непрерывном диапазоне, например в диапазоне дат.
Еще одна важная вещь в кластеризованных индексах (по крайней мере, в SQL Server) заключается в том, что столбцы кластеризации (то есть столбцы, которые составляют порядок сортировки кластерного индекса) включаются в конце каждого некластеризованного индекса, который вы определяете на своем Таблица. Это значительно ускоряет поиск столбцов кластеризации, и это часто очень желательно в базах данных OLAP.
Некластеризованные индексы
Ваша таблица может храниться только в одном физическом порядке. Но в определенные моменты вам нужно искать данные другими способами. Для этих сценариев используется некластеризованный индекс. Это также реализовано как B-Tree, но оно не имеет никакого отношения к порядку ваших данных таблицы, как это делает кластерный индекс. Это означает, что если вам нужны данные из вашей таблицы, которые не включены в ваш некластеризованный индекс, SQL Server придется физически искать данные в вашей таблице, чтобы получить то, что вы хотите. Это еще одна операция, и для многих запросов может быть дорогостоящим и является ключевым соображением при оптимизации таблиц.
Слово
Вы можете написать книгу об этом. У многих есть. Если мне уже не надоели вас, посетите страницу Wikipedia B-Tree. Начните там. Если вы все еще (действительно) заинтересованы, я предлагаю на самом деле программировать простое B-Tree, чтобы вы могли видеть, что участвовало. И, если вы хотите узнать еще более подробную информацию о том, как именно SQL Server сохраняет все это, проверьте Kalen Delaney Внутри SQL Server: механизм хранения. Является ли все это чрезмерным обучением? Это вам решать. Но чем больше вы изучаете это, тем более комфортно вы будете с развитием БД, и тем быстрее станут ваши системы. Я обещаю.
Ответ 5
это означает, что таблица упорядочена, как указано для кластерного индекса. Негрупповой индекс физически хранится отдельно.
Ответ 6
Первичные индексы не являются технически "кластеризованными" индексами, хотя оба они приводят к упорядочению физических данных к данным. Разница очевидна в их самих именах. Первичный индекс имеет дело с первичными ключами. Значение, каждый первичный ключ должен быть уникальным (иначе он не был бы первичным ключом). Индекс кластеризации имеет дело с чем-либо, что не является первичным ключом и по определению может быть не уникальным. Отсюда и происходит слово "кластер". Если вы сортируете данные, которые не являются первичными, это означает, что он может повториться. Когда повторяющиеся данные появляются вместе, это считается "кластером".