Одночасне створення індексів у Firebird 5
Наразі, коли індекс будується, будь-які зміни даних таблиці заборонені. Це необхідно для створення коректного індексу, щоб не пропустити нові ключі, вставлені під час побудови.
Алгоритм конкурентної побудови індексу дозволяє значно скоротити час, протягом якого потрібне таке блокування читання. Хоча він не повністю усуває необхідність блокувати конкурентні зміни даних таблиці, час такого блокування значно менший порівняно з традиційним неконкурентним алгоритмом. Це особливо корисно у виробничому середовищі, де блокування активності користувачів на тривалий період є непрактичним або неможливим.
Через конкурентне навантаження та додаткову складність конкурентне створення індексу може зайняти більше часу, ніж традиційний підхід.
Синтаксис
Нове необов’язкове незарезервоване ключове слово CONCURRENTLY використовується для визначення конкурентного створення індексу.
Створення нового індексу
CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]] INDEX indexname ON tablename {(col [, col ...]) | COMPUTED BY ()} [WHERE ] [CONCURRENTLY]
Активація існуючого індексу
ALTER INDEX indexname {ACTIVE | INACTIVE} [CONCURRENTLY]
Зверніть увагу, що CONCURRENTLY можна використовувати лише з ACTIVE.
Перевірка унікальності
Практично неможливо перевірити унікальність індексу, поки індекс будується конкурентно. Тому коли унікальний індекс створюється (або активується) конкурентно, він одразу позначається як NOT VALIDATED у системному каталозі. Унікальність індексу перевіряється після завершення побудови індексу, коли індекс містить ключі для всіх записів таблиці.
Якщо перевірка унікальності успішна, позначку NOT VALIDATED знімають.
Якщо перевірка унікальності не вдалася, індекс залишається активним і позначений як NOT VALIDATED. Пізніше користувач може знайти та виправити дублікати та знову перевірити унікальність або видалити індекс, якщо це доречно.
Зверніть увагу, що унікальний індекс з позначкою NOT VALIDATED все одно не дозволяє вводити дублікати в таблицю.
Щоб перевірити унікальний індекс, виконайте
ALTER INDEX indexname VALIDATE UNIQUE
Цей оператор виконує сканування індексу для пошуку дублікатів ключів і перевіряє відповідні записи. Якщо дублікатів не знайдено, позначку NOT VALIDATED знімають, і індекс вважається перевіреним. Інакше позначка NOT VALIDATED залишається, і індекс можна перевірити знову пізніше.
Команда isql SHOW INDEX тепер показує позначку NOT VALIDATED, якщо вона присутня.
Обмеження таблиці
Конкурентне створення індексів для обмежень таблиці, таких як PRIMARY|UNIQUE|FOREIGN KEY, поки що не підтримується. Можлива підтримка PRIMARY|UNIQUE KEY у майбутньому, але малоймовірна для FOREIGN KEY.
Приклади
Підготуйте таблицю з деякими даними
create table tab ( id int not null, f1 varchar(64));
insert into tab values (1, '1');
insert into tab values (1, '2');commit;
створіть індекс за допомогою клаузи CONCURRENTLY
create index idx_tab_f1 on tab(f1) concurrently;
створіть унікальний індекс на колонці з дублікатами
create unique index idx_tab_id on tab(id);
це викликає помилку:
Statement failed, SQLSTATE = 23000
attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)
створіть такий самий унікальний індекс за допомогою CONCURRENTLY
create unique index idx_tab_id on tab(id) concurrently;
це видає попередження:
Validation of unique index "IDX_TAB_ID" failed.
-attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)
перевірте, чи існує індекс:
show index idx_tab_id;
IDX_TAB_ID UNIQUE NOT VALIDATED INDEX ON (ID)
зверніть увагу на позначку NOT VALIDATED.
Перевірте індекс:
alter index idx_tab_id validate unique;
Statement failed, SQLSTATE = 23000
unsuccessful metadata update-Validation of unique index "IDX_TAB_ID" failed.
-attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)
Виправте дублікат запису та перевірте знову
update tab set id = 2 where f1 = '2';
commit;
alter index idx_tab_id validate unique;
помилки немає.
Перевірте стан індексу:
show index idx_tab_id;
IDX_TAB_ID UNIQUE INDEX ON (ID)
Завантажте HQbird і спробуйте зараз: /uk/download-hqbird