Создание индекса (CREATE INDEX)
Функция
Определение оператора создания индекса на столбец таблицы.
Спецификация
::={неименованный индекс |именованный индекс |функциональный индекс}
[INDEXFILE номер файла ] [BY APPEND]
::=::=::=::=::=Синтаксические правила
-
В качестве
<имени таблицы>может выступать только базовая таблица.create index model on auto by append;
-
Опция
OR REPLACEзаставляет удалять существующий в БД индекс и создавать его под тем же именем, но с другими параметрами. -
Опция
IF NOT EXISTSотменяет выполнение оператора, если указанный индекс уже существует в БД. -
Одновременное использование опций
IF NOT EXISTSиOR REPLACEзапрещено. -
Максимальное количество столбцов в составном индексе равно 31.
-
Максимальное количество составных индексов в таблице – 100, максимальное количество составных индексов для одного столбца – 10.
-
Для таблиц с одним индексным файлом по умолчанию индекс строится в данном индексном файле.
-
Для таблиц, имеющих более одного индексного файла, по умолчанию индекс строится во втором индексном файле.
-
Опция
INDEXFILEзадает номер основного индексного файла, где должен храниться создаваемый индекс. Если индекс не может полностью поместиться в этот файл, то он будет размещён (полностью или частично) в другом доступном индексном файле.create index "Основные характеристики" on auto (model, cylnders, weight, color) indexfile 3;
-
<Номер файла>не должен превышать количества зарезервированных при создании таблицы индексных файлов. -
Длина индексируемого столбца (столбцов) не должна превышать 1024 байт.
Примечание
Для каждого индексируемого столбца переменной длины к длине столбца прибавляется 2 байта (длина).
-
Опция
BY APPENDзадает режим создания индекса не через сортировку данных (как делается по умолчанию), а через последовательное добавление элементов.Создание индекса на большую таблицу через сортировку (по умолчанию) требует большого дискового пространства и достаточно большого объема оперативной памяти. При создании индекса с помощью опции
BY APPENDфайл сортировки не используется, записи в процессе прохода по конвертеру начинают сразу же добавляться в файл индекса таблицы.Скорость построения индекса будет значительно ниже, поскольку каждый раз необходимо искать место для вставки записи в индексе (если же записи отсортированы, в этом нет необходимости).
Примечание
Опцию рекомендуется использовать в случае отсутствия большого свободного дискового пространства, появления какой-либо ошибки сортировки или слишком большого времени сортировки.
Общие правила
-
Команда создает простые (не фразовые) индексы. Создание фразовых индексов описано в документе «Полнотекстовый поиск в базе данных», пункт «Создание фразового индекса».
-
Создавать индекс может владелец таблицы либо пользователь, получивший привилегию
INDEXна указанную таблицу. -
Если
<именованный индекс>создается для одного столбца, то созданный индекс является именованным одностолбцовым индексом. -
Если
<именованный индекс>создается для нескольких столбцов, то созданный индекс является именованным многостолбцовым (составным) индексом. -
Опция
UNIQUEзадает ограничение целостностиUNIQUEдля создаваемого индекса. Указание опцииUNIQUEэквивалентно выполнению последовательности команд:-
в случае создания неименованного индекса:
CREATE INDEX "Имя столбца" ON "Имя таблицы"; ALTER TABLE "Имя таблицы" ADD UNIQUE ("Имя столбца"); -
в случае создания именованного индекса:
CREATE INDEX "Имя индекса" ON "Имя таблицы"("Имя столбца"[, ...]); ALTER TABLE "Имя таблицы" ADD UNIQUE ("Имя столбца"[, ...]); -
в случае создания функционального индекса опция
UNIQUEнеприменима.
-
-
Конструкция для отмены ограничения целостности
UNIQUEотсутствует. Его можно снять вручную:-
в случае неименованного индекса:
ALTER TABLE "Имя таблицы" DROP UNIQUE ("Имя столбца"); DROP INDEX "Имя столбца" ON "Имя таблицы"; -
в случае именованного индекса:
ALTER TABLE "Имя таблицы" DROP UNIQUE ("Имя столбца"[, ...]); DROP INDEX "Имя индекса" ON "Имя таблицы";
Примечание
Отдельно поданная команда удаления индекса
DROP INDEX "Имя столбца" ON "Имя таблицы";
или
DROP INDEX "Имя индекса" ON "Имя таблицы";
(без предварительной команды
ALTER TABLE …) не отменяет ограничение целостностиUNIQUE. -
-
Если указана опция
UNIQUE, а столбец (столбцы) содержит неуникальные данные, то индекс не создается. -
При определении таблиц с одностолбцовыми (многостолбцовыми) ключами создание и именование индексов выполняется автоматически (исключая столбцы с модификатором
AUTOROWID). -
Имя автоматически созданного индекса имеет вид:
Index #nnnnnnnnnn#
где
nnnnnnnnnn–ROWIDзаписи для индекса/ключа в таблице$$$ATTRI. -
Индексы удаляются автоматически при удалении ключей.
-
Создание индекса разрешено для пустых таблиц.
-
Запрещено создание составных, простых именованных и функциональных индексов для системных таблиц.
-
Запрещено создание простых и функциональных индексов на столбцы
$$$S14,$$$S24,$$$S35(столбцы системных таблиц$$$SYSRL,$$$ATTRI,$$$USRсоответственно). -
Для столбцов типа
PRIMARY KEY, FOREIGN KEYиUNIQUEиндекс создается автоматически всегда. -
Для столбцов типа
AUTOROWIDсоздавать индекс не имеет смысла, т.к. записи выбираются напрямую по значению столбца. -
Составные индексы применяются при обработке
<предиката сравнения>(=, <>, >=, >, <=, <),<интервального предиката> (BETWEEN),<предиката подобия> (LIKE),<предиката неопределенного значения> (NULL),<предиката вхождения> (IN).Примечание
Время перестройки составного индекса меньше, чем суммарное время перестройки простых индексов на те же столбцы.
-
Функциональные индексы применяются при обработке
<предиката сравнения>типа<операция><константа>, где в качестве<операции>допускаются сравнения (<,>,=,<>,LIKE,IS NULL, ...), за исключением'NOT LIKE','NOT SIMILAR','NOT NULL','NOT BETWEEN','NOT IN','NOT MATCH','NAN'и'NOT NAN'.Тестовые данные: create or replace table test(id int, j int, ch char(10)); insert into test values (1,1,'aAa'); insert into test values (2,2,'abA'); insert into test values (3,3,'aaA'); insert into test values (4,4,'aAaA'); insert into test values (5,5,'a'); insert into test values (6,6,'AA'); insert into test values (7,7,NULL); create index "AAA" on test(upper(ch)); select rowid, test.* from test where upper(ch)='AAA'; ROWID ID J CH ----- -- - -- | 1| 1| 1|aAa | | 3| 3| 3|aaA | select rowid, test.* from test where upper(ch) > 'AAA'; ROWID ID J CH ----- -- - -- | 2| 2| 2|abA | | 4| 4| 4|aAaA | select rowid, test.* from test where upper(ch) < 'AAA'; ROWID ID J CH ----- -- - -- | 5| 5| 5|a | | 6| 6| 6|AA | select rowid, test.* from test where upper(ch) is NULL; ROWID ID J CH ----- -- - -- | 7| 7| 7| | select rowid, test.* from test where upper(ch) is not NULL; ROWID ID J CH ----- -- - -- | 1| 1| 1|aAa | | 2| 2| 2|abA | | 3| 3| 3|aaA | | 4| 4| 4|aAaA | | 5| 5| 5|a | | 6| 6| 6|AA | select rowid, test.* from test where upper(ch) like '_B_'; ROWID ID J CH ----- -- - -- | 2| 2| 2|abA |
-
Функциональные индексы не используются ни для сортировки, ни для вычисления соединений.