Souběžné vytváření indexů ve Firebirdu 5
Aktuálně, když se index vytváří, nejsou povoleny žádné modifikace dat tabulky. To je nutné pro vytvoření správného indexu, aby nechyběly nové klíče vložené během vytváření.
Algoritmus souběžného vytváření indexu umožňuje výrazně zkrátit dobu, po kterou je takový zámek čtení vyžadován. I když zcela neodstraňuje potřebu blokovat souběžné modifikace dat tabulky, doba takového blokování je mnohem kratší ve srovnání s tradičním nesouběžným algoritmem. To je užitečné zejména v produkčním prostředí, kde je blokování uživatelské aktivity na dlouhou dobu nepraktické nebo nemožné.
Kvůli souběžnému zatížení a dodatečné složitosti může souběžné vytváření indexu trvat déle než tradiční přístup.
Syntaxe
Nové volitelné nerezervované klíčové slovo CONCURRENTLY se používá k určení souběžného vytváření indexu.
Vytvoření nového indexu
CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]] INDEX indexname ON tablename {(col [, col ...]) | COMPUTED BY ()} [WHERE ] [CONCURRENTLY]
Aktivace existujícího indexu
ALTER INDEX indexname {ACTIVE | INACTIVE} [CONCURRENTLY]
Poznámka: CONCURRENTLY lze použít pouze s ACTIVE.
Validace jedinečnosti
Je obtížné až nemožné zkontrolovat jedinečnost indexu, pokud je index vytvářen souběžně. Proto když je jedinečný index vytvořen (nebo aktivován) souběžně, je okamžitě označen jako NOT VALIDATED v systémovém katalogu. Jedinečnost indexu je validována po dokončení vytváření indexu, když index obsahuje klíče pro všechny záznamy tabulky.
Pokud kontrola jedinečnosti uspěje, označení NOT VALIDATED je odstraněno.
Pokud kontrola jedinečnosti selže, index zůstává aktivní a je označen jako NOT VALIDATED. Uživatel může později najít a opravit duplicity a znovu validovat jedinečnost, nebo index případně odstranit.
Poznámka: NOT VALIDATED jedinečný index stále neumožňuje vkládání duplicit do tabulky.
Pro validaci jedinečného indexu spusťte:
ALTER INDEX indexname VALIDATE UNIQUE
Tento příkaz provede skenování indexu, aby našel duplicitní klíče a zkontroloval odpovídající záznamy. Pokud nejsou nalezeny žádné duplicity, označení NOT VALIDATED je odstraněno a index je považován za validovaný. V opačném případě označení NOT VALIDATED zůstává a index může být validován později znovu.
Příkaz isql SHOW INDEX nyní zobrazuje označení NOT VALIDATED, pokud je přítomno.
Omezení tabulky
Souběžné vytváření indexů pro omezení tabulky, jako je PRIMARY|UNIQUE|FOREIGN KEY, zatím není podporováno. V budoucnu je možné podpořit PRIMARY|UNIQUE KEY, ale u FOREIGN KEY je to nepravděpodobné.
Příklady
Připravte tabulku s nějakými daty
create table tab ( id int not null, f1 varchar(64));
insert into tab values (1, '1');
insert into tab values (1, '2');commit;
vytvořte index pomocí klauzule CONCURRENTLY
create index idx_tab_f1 on tab(f1) concurrently;
vytvořte jedinečný index na sloupci s duplicitami
create unique index idx_tab_id on tab(id);
vyvolá chybu:
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)
vytvořte stejný jedinečný index pomocí CONCURRENTLY
create unique index idx_tab_id on tab(id) concurrently;
vyvolá varování:
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)
zkontrolujte, zda index existuje:
show index idx_tab_id;
IDX_TAB_ID UNIQUE NOT VALIDATED INDEX ON (ID)
všimněte si označení NOT VALIDATED.
Validujte index:
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)
Opravte duplicitní záznam a validujte znovu
update tab set id = 2 where f1 = '2';
commit;
alter index idx_tab_id validate unique;
žádná chyba.
Zkontrolujte stav indexu:
show index idx_tab_id;
IDX_TAB_ID UNIQUE INDEX ON (ID)
Stáhněte si HQbird a vyzkoušejte to hned: /cs/download-hqbird