- •3. Создание индексов и ограничений для базы данных
- •3.1. Индексы в базах данных
- •3.2. Создание и удаление индекса
- •3.3. Типы индексов
- •Индексы в*-дерева
- •Битовые индексы
- •3.4. Обеспечение целостности данных с помощью ограничений
- •Ограничение not null
- •Ограничение unique
- •Ограничение check
- •Разрешение и запрещение существующих ограничений
- •Изменение и удаление существующих ограничений
- •Место определения ограничений
- •3.5. Связи между таблицами
- •Использование ограничений для установления связей между таблицами
- •Многотабличные запросы
- •Внешние соединения
3.2. Создание и удаление индекса
Индекс по одному столбцу создается командой со следующим синтаксисом:
CREATE INDEX имя_индекса ON имя_таблицы(имя_столбца);
Если вы хотите, чтобы индекс содержал более одного столбца, используйте следующий синтаксис:
CREATE INDEX имя_индекса ON имя_таблицы
(имя_первого_столбца,имя_второго_столбца,…) ;
Например, чтобы создать индекс, показанный на рис. 3.1 , можно ввести следующую команду:
CREATE INDEX person_code_index ON person (person_code) ;
Этот индекс наиболее полезен при выполнении поиска со ссылкой на PERSON_CODE в конструкции WHERE. Если же поиск в большинстве случаев ведется по имени и фамилии продавца, то более подходящим окажется индекс по этим двум столбцам. Такой индекс создается следующей командой:
CREATE INDEX person_name_index ON person (last_name, first_name) ;
Это пример составного индекса (composite index), иногда называемого сцепленным индексом (concatenated index). Составной индекс — это просто индекс по двум и более столбцам таблицы. Он подходит в любом случае, когда некоторые столбцы таблицы с большой вероятностью будут использоваться в предложении WHERE совместно — например, имя и фамилия, или город, штат и почтовый индекс. Чтобы Oracle использовал составной индекс, в предложение WHERE должны быть включены либо все его столбцы, либо первый столбец. Столбцы можно помещать в индекс в любом порядке, не обязательно так, как они расположены в таблице, поэтому вы можете сделать первым столбцом тот, который вероятнее всего будет использоваться в предложении WHERE. Столбцы составного индекса не обязаны быть соседними в исходной таблице. Максимальное число столбцов, которые можно включать в стандартный индекс Oracle, равно 32.
Команда удаления индекса имеет следующий синтаксис:
DROP INDEX имя_индекса;
3.3. Типы индексов
Индексирование — это, по существу, способ компактного хранения информации о местонахождении записей, организованной на основе содержимого этих записей. Содержимое базы данных может сильно варьироваться от системы к системе, и для разных типов содержимого оптимальными оказываются разные виды организации. Oracle предлагает несколько типов индексов, в каждом из которых применяется свой организационный подход. В этом разделе описываются два самых распространенных типа индексов; остальные используются только в очень сложных базах данных и больше подходят для книги по администрированию баз данных.
Индексы в*-дерева
Тип индекса, используемый в Oracle по умолчанию, называется В*-деревом (В*-Тгее). Организация записей в индексе В*-дерева показана на рис. 3.3.
При создании индекса В*-дерева Oracle анализирует значения в индексируемом столбце (столбцах) и определяет, как разделить таблицу на блоки-листья (leaf blocks) с равным числом записей. Затем он создает уровни блоков-ветвей (branch blocks), обеспечивающих поиск записей в нижележащих блоках-листьях за минимально возможное число шагов.
В примере на рис. 3.3 блоки-ветви делят алфавит на равные части. На практике точки ветвления определяются в зависимости от значений, содержащихся в записях. Например, если имена в записях таблицы гораздо чаще начинаются на "А", чем на какую-либо другую букву, то букве "А" может быть выделена вся ветвь, а следующая ветвь начнется с буквы "В".
Достоинство индекса В*-дерева в том, что он позволяет Oracle быстро идентифицировать записи, не считывая их. За счет минимизации объема считываемых данных, а следовательно, и объема выполняемой работы, Oracle может возвращать результаты гораздо быстрее. (Помните, что улучшения, перечисленные в таблице 3.1, были достигнуты при использовании стандартного индекса В*-дерева.) Предположим, например, что таблица содержит миллиард записей, и нужно найти запись с определенным идентификационным номером. Таблица не обязательно будет отсортирована по идентификационным номерам, поэтому не исключено, что Oracle должен будет считывать все записи, пока не найдет нужную. Но если для таблицы определен индекс В*-дерева, то Oracle сможет найти запись не более чем за 31 шаг. На каждом шаге исключается половина записей таблицы, поэтому Oracle может очень быстро сократить объем работы до разумных величин.
Поскольку сила индекса В*-дерева заключена в делении данных на множества и подмножества, этот тип индекса оптимален в тех случаях, когда индексируемый столбец содержит широкий диапазон значений — скажем, имена или даты. Для столбца с узким диапазоном значений (например, "пол") лучше всего использовать битовый индекс.

Рис. 3.3. Организация записей в индексе В*-дерева
