Уникальный индекс
Уникальность значений в индексируемом столбце гарантируют уникальные
индексы. При их наличии сервер не разрешит вставить новое или
изменить существующее значение таким образом, чтобы в результате этой
операции в столбце появились два одинаковых значения.
Уникальный индекс является своеобразной надстройкой и может быть
реализован как для кластерного, так и для некластерного индекса . В
одной таблице может существовать один уникальный кластерный и
множество уникальных некластерных индексов.
Уникальные индексы следует определять только тогда, когда это
действительно необходимо. Для обеспечения целостности данных в столбце можно определить ограничение целостности UNIQUE или PRIMARY KEY, а не прибегать к уникальным индексам. Их использование
только для обеспечения целостности данных является неоправданной
тратой пространства в базе данных. Кроме того, на их поддержание
тратится и процессорное время.
Средства языка SQL предлагают несколько способов определения индекса:
- автоматическое создание индекса при создании первичного ключа;
- автоматическое создание индекса при определении ограничения
целостности UNIQUE ;
- создание индекса с помощью команды CREATE INDEX.
Последняя команда имеет следующий формат:
<создание_индекса>::=
CREATE [ UNIQUE ]
[ CLUSTERED | NONCLUSTERED ]
INDEX имя_индекса ON имя_таблицы(имя_столбца
[ASC|DESC][,...n])
[WITH [PAD_INDEX]
[[,] FILLFACTOR=фактор_заполнения]
[[,] IGNORE_DUP_KEY]
[[,] DROP_EXISTING]
[[,] STATISTICS_NORECOMPUTE] ]
[ON имя_группы_файлов ]Рассмотрим некоторые параметры приведенной команды.
Имя индекса должно быть уникальным в пределах таблицы, а сам индекс
создается исключительно для таблицы текущей базы данных.
Параметр UNIQUE используется при необходимости ввода в определенное
поле только уникальных значений. При указании этого ключевого слова
будет создан уникальный индекс. В индексируемом столбце желательно
запретить хранение значений NULL, чтобы избежать проблем, связанных с
уникальностью значений. После того как для столбца появится уникальный индекс, сервер не разрешит выполнение команд INSERT и UPDATE, которые приведут к появлению дублирующих значений.
Параметр CLUSTERED использует возможность физического индексирования
данных и позволяет произвести так называемое кластерное
индексирование, в результате чего будут отсортированы данные в самой таблице согласно порядку этого индекса, а вся добавляемая информация
станет приводить к изменению физического порядка данных. Кластерным
может быть только один индекс в таблице.
Параметр NONCLUSTERED позволяет создавать некластерные индексы.
Параметр FILLFACTOR осуществляет настройку разбиения индекса на
страницы и заметно оптимизирует работу SQL-сервера. Коэффициент FILLFACTOR определяет в процентном соотношении размер создаваемых
индексных страниц. При этом имеется обратно пропорциональная
зависимость частоты работы с таблицей и коэффициента FILLFACTOR.
Параметр PAD_INDEX определяет заполнение внутреннего пространства индекса и применяется совместно с FILLFACTOR.
Параметр DROP_EXISTING при использовании кластерного индекса
определяет его повторное создание, что позволяет предотвратить
нежелательное обновление кластерных индексов.
Параметр STATISTICS_NORECOMPUTE определяет функции автоматического
обновления статистики для таблицы.
Параметр имя_группы_файлов позволяет осуществить выбор файловой
группы, в которой будет находиться создаваемый индекс. Использование индекса из другой файловой группы повышает производительность некластерных индексов в связи с параллельностью выполнения процессов
ввода/вывода и работы с самим индексом.
Удаление индекса
Удаление индекса выполняется командой
DROP INDEX 'имя_индекса'[,...n]
Пример 3.5. Создать уникальный кластерный индекс для таблицы Клиент по столбцу Фамилия в первичной группе файлов.
CREATE UNIQUE CLUSTERED INDEX index_klient1
ON Клиент (Фамилия)
WITH DROP_EXISTING
ON PRIMARY
Пример
3.5.
Создание уникального кластерного индекса.
(html,
txt)
Пример 3.6.Создать уникальный некластерный индекс для таблицы Клиент
по столбцам Фамилия и Имя в первичной группе файлов. Кроме того,
элементы индекса будут упорядочены по убыванию. Также запретим
автоматическое обновление статистики при изменении данных в таблице и
установим фактор заполнения индексных страниц на уровне 30%.
CREATE UNIQUE NONCLUSTERED INDEX index_klient2
ON Клиент (Фамилия DESC,Имя DESC)
WITH FILLFACTOR=30,
STATISTICS_NORECOMPUTE
ON PRIMARY
Пример
3.6.
Создание уникального некластерного индекса.
(html,
txt)