
- •3. Создание индексов и ограничений для базы данных
- •3.1. Индексы в базах данных
- •3.2. Создание и удаление индекса
- •3.3. Типы индексов
- •Индексы в*-дерева
- •Битовые индексы
- •3.4. Обеспечение целостности данных с помощью ограничений
- •Ограничение not null
- •Ограничение unique
- •Ограничение check
- •Разрешение и запрещение существующих ограничений
- •Изменение и удаление существующих ограничений
- •Место определения ограничений
- •3.5. Связи между таблицами
- •Использование ограничений для установления связей между таблицами
- •Многотабличные запросы
- •Внешние соединения
Битовые индексы
Поскольку структура индекса В*-дерева оптимальна для индексирования столбца со многими уникальными значениями, логично предположить, что для столбца с малым числом уникальных значений может лучше подойти другая структура индекса. Например, столбец "пол", скорее всего, будет содержать одно из трех значений: "М" ("мужской"), "F" ("женский") или "U" ("Unknown" — "неизвестный"). Помещение столь малого количества уникальных значений в структуру В*-дерева не имеет смысла, поскольку подход "делить на подгруппы шаг за шагом", делающий В*-дерево столь удобным для поиска многовариантных значений, не даст большого выигрыша. В такой ситуации лучше использовать битовый индекс. Его устройство в несколько упрощенном виде показано на рис. 3.4.
Таблица базы данных Битовый индекс по столбцу GENDER (пол)
-
ROWNUM
LAST_NAME
GENDER
ROWNUM
FEMALE
MALE
UNKNOWN
1
Norton
F
1
1
2
Gutwirth
M
2
1
3
Trumble
M
3
1
4
Fletcher
M
4
1
5
Zoraster
F
5
1
6
Moss
M
6
1
7
Allen
F
7
1
8
Smith
U
8
1
Рис. 3.4. Организация записей в битовом индексе
Под кардинальностью (cardinality) понимается количество уникальных значений, которые может содержать столбец. Столбец с малым количеством уникальных значений (например, пол или значения типа истина/ложь) имеет низкую кардинальность. Столбец с большим количеством уникальных значений (например, цены или имена) имеет высокую кардинальность.
Для тех запросов SELECT, в которых конструкция WHERE содержит столбец с низкой кардинальностью, предварительное создание битового индекса может значительно сократить время получения ответов. Рост скорости обусловлен двумя факторами: во-первых, битовые индексы могут быть довольно компактными (поскольку для хранения бит требуется лишь малая часть того места, которое отводится другим типам данных в стандартном индексе), а во-вторых, значения" 1" или "0" могут анализироваться компьютером очень быстро.
Команда создания битового индекса практически идентична команде создания стандартного индекса; добавляется только слово "BITMAP", как показано в следующем примере:
CREATE BITMAP INDEX имя_индекса ON имя_таблицы(имя_столбца) ;
3.4. Обеспечение целостности данных с помощью ограничений
Одной из важнейших задач, стоящих при создании таблиц базы данных, является обеспечение наивысшего возможного качества данных, которые вводятся пользователями в эти таблицы. "Грязные" данные содержат неверные значения, слишком большие или слишком малые числа, бессмысленные даты или просто пустые значения в тех полях, которые должны быть заполнены. Вы можете в широких пределах контролировать содержимое данных, заносимых в таблицу.
Ограничение (constraint) — это одно и более условий, которым должна удовлетворять введенная пользователем запись, чтобы Oracle вставил ее в таблицу. Ограничения хранятся как часть определения таблицы и после создания применяются автоматически. .Когда введенная кем-либо команда INSERT или UPDATE нарушает ограничение, Oracle прерывает ее выполнение, производит откат и выдает сообщение об ошибке.
В этом разделе рассматривается создание ограничений трех различных типов. При совместном использовании эти ограничения могут оказать значительную помощь в обеспечении целостности табличных данных.