Хранение таблиц • По строкам • По столбцам • Строки нескольких таблиц группируются по общему атрибуту Схема блока с таблицей смещения записей • Обычно длинные объекты CLOB и BLOB хранятся отдельно. • Поля varchar: длина + значение. • При добавлении столбца строки, в которые не было добавлено значение нового атрибута, физически не изменяются. • Поиск в неупорядоченном файле – в среднем половина файла m/2. Таблица, в которой записи упорядочены по значению ключа • Полезны при частых интервальных запросах • Поиск быстрее log2m Индекс - это • Избыточная структура • Служит для ускорения поиска • Простейший индекс строится на основе В-дерева Поиск с помощью индекса: • На точное значение • На интервал • На значение нескольких атрибутов Способы определения индекса: • автоматическое создание индекса при создании первичного ключа; • автоматическое создание индекса при определении ограничения целостности UNIQUE; • создание индекса с помощью команды CREATE INDEX. <создание_индекса>::= • CREATE [ UNIQUE ] • [ CLUSTERED | NONCLUSTERED ] • INDEX имя_индекса ON имя_таблицы(имя_столбца • [ASC|DESC][,...n]) • [[,] DROP_EXISTING] • [ON имя_группы_файлов ] UNIQUE • Используется при необходимости ввода в определенное поле только уникальных значений. • В индексируемом столбце желательно запретить хранение значений NULL. • Запрещается выполнение команд INSERT и UPDATE, которые приведут к появлению дублирующих значений. CLUSTERED • Использует возможность физического индексирования данных • В результате будут отсортированы данные в самой таблице согласно порядку этого индекса. • Добавление информации в таблицу приводит к изменению физического порядка данных. • Кластерным может быть только один индекс в таблице. index-organised table • Аналог clustered index • Таблица хранится в виде В-дерева Виды индексов: • • • • B-деревья Hash-индексы Индексы на основе битовых карт R-деревья В-дерево • Имеет внутренние и листовые страницы • Листовые вершины находятся на самом нижнем уровне дерева, все остальные внутренние • В-дерево – сбалансированная структура, т.е. от корня до любой листовой страницы одинаковое число шагов • листовые страницы связаны одно- или двунаправленным списком. В-дерево • В типовом случае структура внутренней страницы выглядит следующим образом: • При этом выдерживаются следующие свойства: • ключ(1) <= ключ(2) <= ... <= ключ(n); • в странице дерева Nm находятся ключи k со значениями ключ(m) <= k <= ключ(m+1). • Листовая страница обычно имеет следующую структуру: • Листовая страница обладает следующими свойствами: • ключ(1) < ключ(2) < ... < ключ(t); • сп(r) - упорядоченный список идентификаторов кортежей (tid), включающих значение ключ(r); Пример В-дерева Вставка в В-дерево Кластерный индекс • Таблица упорядочена по значению ключа • Для каждого блока данных в индекс помещаем минимальное значение ключа и адрес блока. • С индексными блоками поступаем так же, наращивая уровни, пока не появится уровень из одного блока. Кластерный индекс Некластерный индекс • В индексный файл для каждой записи помещаем пару: значение ключа + - адрес записи, если нет кластерного индекса - указатель на значение записи из кластерного индекса • В новый индексный уровень помещаем минимальное значение ключа и адрес индексного блока. • Наращивая уровни, пока не появится уровень из одного блока. Некластерный индекс Hash-индекс • Create hash claster кластер1 on поле1… • Create table имя_табл into кластер1 поле_табл as поле1 Hash-индекс • Для размещения таблицы отводится заданное количество участков • Есть функция hash(key)=n, где n – номер участка • В памяти хранится таблица адресов участков • Проблема – неравномерность размещения записей, возникновение коллизий Индексы на основе битовых карт • create bitmap index i4 on t1(town) • Нужны тогда, когда у столбца может быть ограниченное число значений. • В индекс входят: – значение столбца – битовая последовательность по количеству строк таблицы, в кот. 1 означает, что в данной строке атрибут принимает заданное значение Индексы на основе битовых карт • Индексы на основе битовых карт обычно создаются быстрее и могут занимать удивительно мало места. • Размер индекса на основе битовых карт существенно зависит от распределения данных. • Индексы на основе битовых карт обычно выбираются стоимостным оптимизатором, если для выполнения запроса можно использовать несколько таких индексов. • Изменения столбцов, входящих в индексы на основе битовых карт, а также вставки и удаления данных могут вызывать существенные конфликты блокировок. • Изменения столбцов, входящих в индексы на основе битовых карт, а также вставки и удаления данных могут весьма существенно "ухудшать" индексы.