Tato stránka byla strojově přeložena. Přečtěte si anglický originál. English

Knihovna IBSurgeon

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

Code
CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]]  INDEX indexname ON tablename  {(col [, col ...]) | COMPUTED BY ()}  [WHERE ]  [CONCURRENTLY]

Aktivace existujícího indexu

Code
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:

Code
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

Code
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

Code
create index idx_tab_f1 on tab(f1) concurrently;

vytvořte jedinečný index na sloupci s duplicitami

Code
create unique index idx_tab_id on tab(id);

vyvolá chybu:

Code
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

Code
create unique index idx_tab_id on tab(id) concurrently;

vyvolá varování:

Code
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:

Code
show index idx_tab_id;
IDX_TAB_ID UNIQUE NOT VALIDATED INDEX ON (ID)

všimněte si označení NOT VALIDATED.

Validujte index:

Code
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

Code
update tab set id = 2 where f1 = '2';
commit;
alter index idx_tab_id validate unique;

žádná chyba.

Zkontrolujte stav indexu:

Code
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