нас темы мы можем либо просматривать всю книгу подряд, либо использовать
индекс книги, чтобы непосредственно найти точное место нахождения
интересующей нас темы. Индекс базы данных по своей концепции
весьма похож на индекс книги за тем исключением, что он используется
для отыскания конкретных строк в таблице. Оборотной стороной
использования индексов является то, что при добавлении в таблицу новой
строки требуется дополнительное время для обновления индексов, чтобы
учесть новую строку.
Обычно индекс для столбца следует использовать только в том случае,
если из многострочной таблицы выбирается лишь несколько строк. Хорошим
эмпирическим правилом является следующее:
создайте индекс, если запрос отбирает из таблицы не более 10% от общего числа
ее строк.
334 Глава 10
Это означает, что столбец, являющийся кандидатом для построения
индекса, должен содержать широкий спектр значений. Такие типы индексов
называют индексами «В-tree». Это имя происходит от названия древовидной
структуры данных, которую используют в теории вычислительных
систем. Хорошим кандидатом для создания индекса будет столбец, содержащий
уникальное значение для каждой записи (например, номер социального
страхования), в то время как столбец, содержащий небольшой
диапазон числовых значений (например, N, Е, S, W или 1, 2, 3, 4, 5, 6), будет
плохим кандидатом. База данных Oracle автоматически создаёт индекс
B-tree для первичного ключа таблицы и столбцов, добавленных к ограничению
по уникальности. Для столбцов, которые содержат небольшой
диапазон значений, вы можете использовать bitmap-индекс.
В этом разделе вы узнаете как:
■ Создать B-tree индекс.
■ Создать индекс на базе функции.
■ Получить информацию об индексе из словаря данных.
■ Изменить индекс.
■ Удалить индекс.
■ Создать bitmap-индекс.
Создание B-tree индекса
Индекс B-tree создается с помощью оператора CREATE INDEX, который имеет
следующий упрощенный синтаксис:
□ CREATE [UNIQUE] INDEX имя_индекса ON
имя_таблицы(имя_столбца[, имя_столбца . . . ] )
TABLESPACE табл_простр;
где
■ UNIQUE определяет, что значения индексируемого столбца должны
быть уникальны;
■ имя_индекса определяет имя индекса;
■ имя_таблицы определяет имя таблицы базы данных;
■ имя_столбца определяет имя столбца, по которому создается индекс.
Вы можете создать индекс по нескольким столбцам; такой индекс называется
составным;
■ табл_простр определяет табличное пространство для индекса. Если
имя табличного пространства не указано, индекс будет храниться в
табличном пространстве пользователя по умолчанию.
Совет Обычно по соображениям производительности индексы хранятся не в том табличном
пространстве, где хранятся таблицы. Но в этой главе для упрощения примеров будет
использоваться табличное пространство по умолчанию. В вашей собственной базе данных
вы должны попросить АБД создать отдельные табличные пространства для таблиц и
для индексов. ____________________ ________________
Создание таблиц, последовательностей, индексов и представлений 335
Теперь я покажу, каким что нужно делать при создании B-tree индекса
для столбца customers.last_name. Предположим, что в таблице customers
содержится большое число строк и что вы регулярно выбираете из нее
строки, используя следующий запрос:
□ SELECT customer-id, first_name, last_name
FROM customers
WHERE last_name = ‘ Brown’ ;
Предположим также, что в столбце last_name содержатся достаточно
уникальные значения, так что любой запрос, использующий во фразе WHERE
столбец last_name, возвращает не более 10% от общего числа строк в таблице.
Следовательно, столбец last_name является хорошим кандидатом
для индексирования.
Следующий оператор CREATE INDEX создает индекс i_customers_last_name
по столбцу last_name таблицы customers (я всегда добавляю i_ в начале названия
индекса):
□ CREATE INDEX i_customers_last_name ON customers(last_name);
После создания индекса запросы типа предыдущего, в которых отыскивается
конкретная фамилия (last_name), будут выполняться быстрее, чем
раньше.
Можно добиться принудительной уникальности значений в столбце с
помощью уникального индекса. В следующем примере создается уникальный
индекс по столбцу customers.phone, которому присваивается имя i_
customers_phone:
□ CREATE UNIQUE INDEX i_customers_phone ON customers(phone);
Можно также создать составной индекс по нескольким столбцам. В следующем