
- •Логические и физические записи данных, виды организации файлов
- •Смешанные файлы
- •Последовательные файлы
- •Индексы, индексные и индексированные файлы
- •Многоуровневые индексы
- •Индексно – последовательные файлы
- •Хешированные файлы (файлы прямого доступа)
- •Метод открытой адресации
- •Метод области переполнения
- •Контрольные вопросы и упражнения
Индексы, индексные и индексированные файлы
Большие таблицы могут занимать много дисковых страниц. Поэтому считывание всей таблицы в оперативную память для поиска определенного множества строк может потребовать сравнительно большого времени, так как диски - медленные устройства по сравнению с оперативной памятью.
Индекс или индексный файл – структура данных, ускоряющая поиск и выборку данных из файла данных. Индекс в БД аналогичен предметному (алфавитному) указателю в книге. Указатель книги позволяет осуществлять доступ к информации в порядке, отличном от порядка расположения страниц книги. Такой указатель представляет собой слова или фразы и ссылки на соответствующие страницы книги.
Как и предметный указатель терминов (слов) книги, индекс БД упорядочен и содержит ссылку – адрес соответствующей физической страницы , где содержится запись с определенным значением индекса. Файл, содержащий индексы, в отличие от файла данных называется индексным файлом.
Каждая запись такого файла содержит упорядоченные значения индекса и адрес физической страницы в файле, содержащий определенное значение индекса. Таким образом, индексный файл состоит из двух компонентов: индекса и указателя на страницу в индексированном файле данных. Файл данных, имеющий индексный файл, является индексированным. Записи в индексном файле упорядочены по значениям индексного файла.
Пример. Индексный файл с индексом по коду (номеру) служащего. Индексный файл упорядочен по значениям индекса. В данном примере для упрощения одна страница файла данных состоит из двух записей. Запись индексного файла намного короче, чем запись файла данных, но в примере условно на одной странице – также две записи
Время поиска в индексированном файле пропорционально log2N , N – число записей в индексном файле. Важно то, что индексный файл гораздо меньше по объему, чем файл данных, поэтому его считывание в оперативную память происходит гораздо быстрее. Определив значение индекса, система может считывать не весь файл данных, а только нужные страницы.
Индексы на базе одного атрибута называются простыми, из нескольких атрибутов - составными. Для составного индекса его значения упорядочиваются вначале по первому полю, при совпадении первого поля по второму и т.д. В частности, составной индекс Access может включать до 10 – ти полей. При этом каждая таблица может иметь до 32-х индексов.
Если двум записям данных запрещено иметь одинаковое значение индекса, то такой индекс называется уникальным. В противном случае индекс не уникальный. Индекс, соответствующий ключу записи, называется первичным. Для первичного индекса не допускается повторяющихся значений, т.е. он по определению уникальный.
Индекс, который определен на поле, отличном от поля упорядочивания файла, называется вторичным. У вторичного индекса значения могут повторяться, т.е. не обязательно уникальные. Файл может иметь один первичный индекс и несколько вторичных. Вторичные индексы также обеспечивают возможность ускоренного доступа к данным с помощью двоичного поиска.
Рассмотрим разновидности индексов.
Приведенный пример соответствует так называемому плотному индексу (dense index). В этом случае каждому значению индекса отвечает определенная физическая запись. Поскольку размер индексного файла намного меньше размера файла данных, то он может быть быстро загружен в основную память, в которой и происходит двоичный поиск по индексу. Затем по найденному индексу и адресу страницы определяется и считывается страница в файле данных.
В противоположность плотному индексу разреженный (sparse) индекс содержит одно значение индекса на группу (блок) записей в файле данных. Поэтому при поиске находится значение индекса в индексном файле, а затем производится последовательный поиск нужной записи в блоке записей. Тем не менее, поиск значительно ускоряется.
Предположим, что файл данных содержит 106 записей. Для последовательного поиска нужной записи необходимо в среднем полмиллиона операций доступа к основному файлу данных. Пусть индексный файл имеет всего 1000 различных значений индекса. Тогда для поиска значения в индексном файле понадобится log21000 ≈10 операций доступа. Для нахождения нужной записи в блоке из 1000 записей потребуется ещё примерно 500 операций доступа (половина от 1000) в главном файле. Ускорение поиска составит как отношение 500000 к 510 или примерно в 1000 раз.
Для создания индексов в языке SQL служат инструкции CREATE TABLE при создании таблицы и CREATE INDEX для существующей таблицы. Пример:
CREATE INDEX ДатаРождения ON Служащие ( [Дата Рождения]);
Более подробные сведения см. в лекции № 8.
У индексации имеются и недостатки. Индексные файлы занимают дополнительное место на диске. Но не это главное. Главное, что наличие индексов требует реорганизации самих индексных файлов при добавлении и обновлении записей, чтобы индексные файлы оставались упорядоченными по индексу. На это требуется дополнительное время. Поэтому не следует создавать индексы по всем атрибутам. Обычно их нужно создавать для следующих атрибутов:
Первичные ключи отношений.
Внешние ключи.
Атрибуты, по которым часто производятся запросы.
Атрибуты, по которым часто производится сортировка данных.
Следует избегать создавать индексы по атрибутам, значения которых часто изменяются.