Ограничения на индексы
Максимальная длина ключа индекса ограничена 1/4 размера страницы.
Максимальная длина ключа индекса ограничена 1/4 размера страницы.
Максимальная длина индексируемой строки на 9 байтов меньше, чем максимальная длина ключа.Максимальная длина индексируемой строки зависит от размера страницы и набора символов.
Размер страницы |
Максимальная длина индексируемой строки для набора символов, байт/символ |
||||
---|---|---|---|---|---|
1 |
2 |
3 |
4 |
6 |
|
4096 |
1015 |
507 |
338 |
253 |
169 |
8192 |
2039 |
1019 |
679 |
509 |
339 |
16384 |
4087 |
2043 |
1362 |
1021 |
681 |
32768 |
8183 |
4091 |
2727 |
2045 |
1363 |
Для каждой таблицы максимально возможное количество индексов ограничено и зависит от размера страницы и количества столбцов в индексе.
Размер страницы |
Число индексов в зависимости от количества столбцов в индексе |
||
---|---|---|---|
1 |
2 |
3 |
|
4096 |
203 |
145 |
113 |
8192 |
408 |
291 |
227 |
16384 |
818 |
584 |
454 |
32768 |
1637 |
1169 |
909 |
Выполнить оператор CREATE INDEX
могут:
Владелец таблицы, для которой создаётся индекс;
Пользователи с привилегией ALTER ANY TABLE
.
CREATE INDEX IDX_UPDATER ON SALARY_HISTORY (UPDATER_ID);
CREATE DESCENDING INDEX IDX_CHANGE
ON SALARY_HISTORY (CHANGE_DATE);
CREATE INDEX IDX_SALESTAT ON SALES (ORDER_STATUS, PAID);
CREATE UNIQUE INDEX UNQ_COUNTRY_NAME ON COUNTRY (NAME);
CREATE INDEX IDX_NAME_UPPER ON PERSONS
COMPUTED BY (UPPER (NAME));
Такой индекс может быть использован для не чувствительного к регистру поиска.
SELECT *
FROM PERSONS
WHERE UPPER(NAME) STARTING WITH UPPER('Iv');
CREATE INDEX IT1_COL ON T1 (COL) WHERE COL < 100;
Если при выполнении выборки в условии WHERE
будет точно такое же выражение, которое было задано в индексе, индекс будет использован, в противном случае нет.
SELECT * FROM T1 WHERE COL < 100;
-- PLAN (T1 INDEX (IT1_COL))
В следующем примере создаётся индекс, в который не будут включены значения NULL
.
CREATE INDEX IT1_COL2 ON T1 (COL) WHERE COL IS NOT NULL;
Этот индекс может использоваться почти любыми предикатами поиска за исключением IS NULL
и IS NOT DISTINCT FROM
, поскольку другие выражение игнорируют NULL
.
SELECT * FROM T1 WHERE COL > 100;
-- PLAN (T1 INDEX IT1_COL2)
Частичный индекс можно создать по нескольким значениям столбца, для этого их надо перечислить в IN
или объединить несколько выражений оператором OR
.
CREATE INDEX IT1_COL3 ON T1 (COL) WHERE COL = 1 OR COL = 2;
SELECT * FROM T1 WHERE COL = 2;
-- PLAN (T1 INDEX IT1_COL3)
ALTER INDEX
Перевод индекса в активное/неактивное состояние, перестройка индекса.
DSQL, ESQL.
ALTER INDEX indexname {ACTIVE | INACTIVE};
Параметр | Описание |
---|---|
indexname |
Имя индекса. |
Оператор ALTER INDEX
переводит индекс в активное/неактивное состояние.Возможность изменения структуры и порядка сортировки ключей этот оператор не предусматривает.
INACTIVE
При выборе опции INACTIVE
, индекс переводится из активного в неактивное состояние. Перевод индекса в неактивное состояние по своему действию похоже на команду DROP INDEX
за исключением того, что определение индекса сохраняется в базе данных. Невозможно перевести в неактивное состояние индекс участвующий в ограничении.
Активный индекс может быть отключен, только если отсутствуют запросы использующие этот индекс, иначе будет возвращена ошибка “object in use”.
Активация неактивного индекс также безопасна.Тем не менее, если есть активные транзакции, модифицирующие таблицу, то транзакция, содержащая оператор ALTER INDEX
потерпит неудачу, если она имеет атрибут NO WAIT
.Если транзакция находится в режиме WAIT
, то она будет ждать завершения параллельных транзакций.
С другой стороны, если наш оператор ALTER INDEX
начинает перестраивать индекс на COMMIT
, то другие транзакции, изменяющие эту таблицу, потерпят неудачу или будут ожидать в соответствии с их WAIT
/NO WAIT
атрибутами.Та же самая ситуация будет и при выполнении CREATE INDEX
.
Tip
|
Перевод индекса в неактивное состояние может быть полезен при массовой вставке, модификации или удалении записей из таблицы, для которой этот индекс построен. |
ACTIVE
При выборе альтернативы ACTIVE
индекс переводится из неактивного состояния в активное. При переводе индекса из неактивного состояния в активное — индекс перестраивается.
Tip
|
Даже если индекс находится в активном состоянии оператор |
ALTER INDEX
для индексов ограниченийПринудительный перевод индексов созданных для ограничений PRIMARY KEY
, FOREIGN KEY
и UNIQUE
не допускается.Тем не менее выполнение оператора ALTER INDEX … INACTIVE
работает так же хорошо для индексов ограничений, как и другие инструменты для других индексов.
ALTER INDEX
?Выполнить оператор ALTER INDEX
могут:
Владелец таблицы, для которой построен индекс;
Пользователи с привилегией ALTER ANY TABLE
.
ALTER INDEX IDX_UPDATER INACTIVE;
ALTER INDEX IDX_UPDATER ACTIVE;
DROP INDEX
Удаление индекса из базы данных.
DSQL, ESQL.
DROP INDEX indexname
Параметр | Описание |
---|---|
indexname |
Имя индекса. |
Оператор DROP INDEX
удаляет существующий индекс из базы данных.При наличии зависимостей для существующего индекса (если он используется в ограничении) удаление не будет выполнено.
Выполнить оператор DROP INDEX
могут:
Владелец таблицы, для которой построен индекс;
Пользователи с привилегией ALTER ANY TABLE
.
SET STATISTICS
Пересчёт селективности индекса.
DSQL, ESQL.
SET STATISTICS INDEX indexname
Параметр | Описание |
---|---|
indexname |
Имя индекса. |
Оператор SET STATISTICS
пересчитывает значение селективности для указанного индекса.
Селективность (избирательность) индекса — это оценочное количество строк, которые могут быть выбраны при поиске по каждому значению индекса.Уникальный индекс имеет максимальную селективность, поскольку при его использовании невозможно выбрать более одной строки для каждого значения ключа индекса.Актуальность селективности индекса важна для выбора наиболее оптимального плана выполнения запросов оптимизатором.
Пересчёт селективности индекса может потребоваться после массовой вставки, модификации или удалении большого количества записей из таблицы, поскольку она становится неактуальной.
Note
|
Отметим, что в Firebird статистика индексов автоматически не пересчитывается ни после массовых изменений данных, ни при каких либо других условиях.При создании ( |
Пересчёт селективности индекса может быть выполнен под высоко параллельной нагрузкой без риска его повреждения.Тем не менее следует помнить, что при высоком параллелизме рассчитанная статистика может устареть, как только закончится выполнение оператора SET STATISTICS
.
Выполнить оператор SET STATISTICS
могут:
Владелец таблицы, для которой построен индекс;
Пользователи с привилегией ALTER ANY TABLE
.
SET STATISTICS INDEX IDX_UPDATER;