Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЛЕЩ.docx
Скачиваний:
47
Добавлен:
13.05.2015
Размер:
3.97 Mб
Скачать

1.3.8.4. Индексирование таблиц

Для таблиц могут создаваться индексы. Индекс логически представляет собой таблицу из двух колонок: в первой находятся значения индекса в порядке убывания или возрастания, а во второй – адреса записи таблицы со значением данного индекса. Адреса могут быть абсолютными (номер цилиндра, дорожки, сектора), отно­ситель­ными (номер записи в таблице) или сим­во­ли­ческими.

Индексом может быть поле или группа полей (сос­тав­ной индекс).

Физическая организация индексов, обычно скрыта от программиста и для различных СУБД она различная. Например, для Accessиндексы хранятся вместе с данными в одном файле, а дляVisualFoxPro– в отдельном файле для одного и группы индексов.

Пример. Создадим для таблицы сотрудников (таблица 1.3.8.4.1) индекса по табельному номеру (таблица 1.3.8.4.2).

Таблица 1.3.8.4.1

Таблица «Сотрудники»

Запись №

Табельный №

Фамилия

Код подразделения

Другие поля

1

20

Иванов

2

2

50

Сидоров

1

3

30

Петров

2

4

10

Агеев

1

5

60

Смирнов

2

Таблица 1.3.8.4.2

Таблица индексов по табельному номеру

Табельный №

Запись №

10

4

20

1

30

3

50

2

60

5

При измене­нии информации в таблице автоматически обновляются все индексы таблицы.

Наличие индекса позволяет:

  1. Обработать таблицу в нужной последовательности (логическая сортировка таблицы). Для этого назначается главный индекс, который задает порядок (по возрастанию или убыванию значения индекса) чтения записей таблицы (в примере по возрастанию значения табельного номера). Глав­­ный индекс можно определить при помощи специальных ко­манд управления индексами (например, Set Index toдля FoxPro, или фразой фразаSet Order ToоператораSelectязыкаSQL).

  2. Осуществить прямой поиск нужной записи по ее индексу (например, табельного номера равного 30) методом двоичного поиска записи индексной таблицы и сравнения текущего индекса с искомым значением индекса (30). Если текущий индекс не совпадает с исходным, то СУБД выводит сообщение об отсутствии записи с исходным значение индекса (обычно, это может случиться после аварийного завершения работы с базой данных, например, при отключении электропитания или “зависания” операционной системы). После нахождения записи в индексном файле выби­ра­ет­ся адрес (номер записи 3), и запись таблицы с данным адресом (под номером 3) становится текущей. Так как размеры индексных файлов небольшие, то они хранятся в оперативной памяти и двоичный поиск в оперативной памяти производится максимально быстро. В нашем примере, нужно найти запись о сотруднике с табельным номером 30, то будет не последовательный поиск нужной записи, а двоичный в индексной таблице, что значительно быстрее (число шагов поиска равно двоичному логарифму из числа всех записей в индексной таблице). Если учесть, что СУБД все знает о своих файлах, размерах записей и таблиц, о типе и емкости дисководов, то она рассчитывает точный физический адрес записи по ее номеру в таблице (имя диска, номер цилиндра, дорожки и сектора) и головка чтения за одно перемещение находит и читает нужную запись. Таким образом, время поиска и чтения практически не зависит от числа записей в таблице и примерно равно времени механического перемещения головки чтения и записи дисковода и одного оборота диска. Если индексная таблица содержит много записей, то могут использоваться иерархическая, а не линейная организация хранения индексов, что ускоряет поиск записей (это внутренняя задача самой СУБД, программист освобожден от этого).

  3. Организовать быстрый последовательный поиск группы записей таблицы по условию их отбора путем использования фильтрованного ин­дек­са или использовать индексы вместо полей записей таблицы в усло­виях отбора записей. Например, вывести сотрудников подразделения с кодом 2.

  4. Для полей связей таблиц должны быть созданы индексы.

Обычно выделяют следующие типы индексов.

Первичный (Primary)который является уникальным, служит для связи с другими таблицами (индекс для первичного ключа). У таблицы может быть только один первич­ный индекс. Индексные поля не могут иметь пустые зна­че­ния.

Вторичный, иликандидат (Candidat), аналогичный первичному, но не может быть им, так как место первичного индекса уже занято (индекс для вторичного ключа).

Уникальный (Unique) индекс хранит неповторяющиеся значения индекса, т.е. дублирующиеся значения игнорируются.

Регулярный (Regular) индекс хранит значения индексов всех за­писей таблицы. Обычно такой индекс является внешним ключом.

Фильтрованный индекс – индекс формируется только для тех записей, которые удовлетворяют некоторому заданному условию.

Кластерный индекс– при создании индекса происходит физическая сортировка индексируемой таблицы, что ускоряет работу с этой таблицей. Обычно, кластерный индекс создается для редко изменяемых таблиц, например, справочников единиц измерения, подразделений, должностей.