Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
бд / Лекция 6 - Представления, индексы.docx
Скачиваний:
29
Добавлен:
14.05.2015
Размер:
396.6 Кб
Скачать

Экстенты

Экстенты являются основными единицами организации пространства.

1 экстент = 8 страниц = 64 КБ.

Это значит, что в одном мегабайте базы данных SQL Server содержится 16 экстентов.

Чтобы сделать распределение места эффективным, SQL Server не размещает целые экстенты в таблицы с небольшим объемом данных. SQL Server имеет два типа экстентов.

  • Однородные экстенты принадлежат одному объекту; все восемь страниц в кластере могут быть использованы только этим владеющим объектом.

  • Смешанные экстенты могут находиться в общем пользовании у не более восьми объектов. Каждая из восьми страниц в экстенте может находиться во владении разных объектов.

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

Сразу после создания, пока таблица не имеет индексов, таблица выглядит как куча данных. Записи не имеют определенного порядка хранения.

Рис. 1 Куча (A heap)

Когда вы хотите получить доступ к данным, SQL Server будет производить сканирование таблицы (table scan). SQL Server сканирует всю таблицу что бы найти искомые записи. Например мы хотим найти запись, удовлетворяющую условию:

SELECT * FROM Customers

WHERE CustomerID = ‘ROMEY’

SQL Server прочитает все записи начиная с первой и заканчивая последней и выберет те, которые будут удовлетворять указанному условию. SQL Server не знает что в таблице существует только одна запись, удовлетворяющая условию, пока в таблице не существует unique constraint, unique index или primary key. Во всех трёх перечисленных случаях создается индекс для поддержания ограничения. Приведенный пример иллюстрирует две базовые функции индексов:

  • увеличение скорости доступа к данным

  • поддержка уникальности данных

Недостатки индексов

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

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

В SQL Server индексы хранятся в виде B-деревьев (B-tree). “B” означает сбалансированное (не путать с бинарным). Рис 2 показывает индекс, созданный для поля CustomerID для таблицы Customers.

Рис. 2 B-Tree индекс

Теперь если выполнить предыдущий запрос по поиску записи CustomerID = ‘ROMEY’, будут прочитаны только страницы 30, 22 и 10 в указанном порядке.

Как указывалось ранее, индексы в SQL Server представляют собой сбалансированные деревья. Это означает, что длины веток для всех ответвлений индекса, одинаковы. Если посмотреть на Рис. 2 сверху вниз, вам придется просканировать только три страницы что бы найти запись удовлетворяющую условию. Каждая ветка сбалансирована и внутренний механизм построения индексов держит это дерево сбалансированным при любых изменениях в таблице.

Обратите внимание что на Рис. 2 данные не отсортированы. Это значит что при создании индекса должен быть создан уровень листьев (leaf level), содержащий указатели на данные отсортированные по указанному ключу (это уровень, обозначенный страницами с 20 по 23). На Рис.2 указатель представляет собой row ID, который имеет следующий формат: НомерФайла:НомерСтраницы:ПозицияЗаписи. Таким образом ID 1:13:5 указывает пятую запись, тринадцатой страницы в файле номер один. Любой другой уровень индексов называется не лепестковым или промежуточным уровнем. Самый первый уровень индексов является “входной дверью” в индекс и называется корневым. Корневой уровень состоит только из одной страницы и содержит указатели на ключи следующих уровней индекса.

http://www.youtube.com/watch?v=coRJrcIYbF4 – видео-иллюстрация механизма формирования сбалансированного дерева.

Все индексы имеют одинаковую В-tree структуру. SQL Server предлагает к использованию два типа индекса: кластерный (clustered) и некластерный (nonclustered).