Deze pagina is automatisch vertaald. Lees het Engelse origineel. English

IBSurgeon-bibliotheek

Gelijktijdige indexcreatie in Firebird 5

Momenteel is het, wanneer een index wordt opgebouwd, niet toegestaan om wijzigingen aan te brengen in tabelgegevens. Dit is nodig om een correcte index te creëren zonder nieuwe sleutels te missen die tijdens de build worden ingevoegd.

Het algoritme voor gelijktijdige indexopbouw maakt het mogelijk om de tijd waarin een dergelijke leesvergrendeling nodig is aanzienlijk te verkorten. Hoewel het de noodzaak om gelijktijdige wijzigingen aan tabelgegevens te blokkeren niet volledig elimineert, is de tijd van een dergelijke blokkering veel korter in vergelijking met het traditionele niet-gelijktijdige algoritme. Dit is vooral nuttig in productieomgevingen waar het blokkeren van gebruikersactiviteit gedurende lange perioden onpraktisch of onmogelijk is.

Vanwege gelijktijdige belasting en extra complexiteit kan het gelijktijdig creëren van een index langer duren dan de traditionele aanpak.

Syntaxis

Het nieuwe optionele niet-gereserveerde trefwoord CONCURRENTLY wordt gebruikt om gelijktijdige indexcreatie aan te geven.

Nieuwe index creëren

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

Bestaande index activeren

Code
ALTER INDEX indexname {ACTIVE | INACTIVE}  [CONCURRENTLY]

Let op: CONCURRENTLY kan alleen worden gebruikt met ACTIVE.

Uniciteitsvalidatie

Het is moeilijk tot onmogelijk om indexuniciteit te controleren terwijl de index gelijktijdig wordt opgebouwd. Daarom wordt een unieke index, wanneer deze gelijktijdig wordt gecreëerd (of geactiveerd), onmiddellijk gemarkeerd als NOT VALIDATED in het systeemcatalogus. De indexuniciteit wordt gevalideerd nadat de indexopbouw is voltooid, wanneer de index sleutels bevat voor alle records van de tabel.

Als de uniciteitscontrole slaagt, wordt de NOT VALIDATED markering gewist.

Als de uniciteitscontrole faalt, blijft de index actief en wordt deze gemarkeerd als NOT VALIDATED. Later kan de gebruiker duplicaten vinden en corrigeren en de uniciteit opnieuw valideren, of de index verwijderen indien van toepassing.

Let op: een NOT VALIDATED unieke index staat nog steeds niet toe dat duplicaten in de tabel worden ingevoerd.

Om een unieke index te valideren, voer je uit:

Code
ALTER INDEX indexname VALIDATE UNIQUE

Deze instructie voert een indexscan uit om dubbele sleutels te vinden en de bijbehorende records te controleren. Als er geen duplicaten worden gevonden, wordt de NOT VALIDATED markering gewist en wordt de index als gevalideerd beschouwd. Anders blijft de NOT VALIDATED markering aanwezig en kan de index later opnieuw worden gevalideerd.

Het isql-commando SHOW INDEX toont nu de NOT VALIDATED markering, indien aanwezig.

Tabelbeperkingen

Gelijktijdige creatie van indices voor tabelbeperkingen, zoals PRIMARY|UNIQUE|FOREIGN KEY, wordt nog niet ondersteund. Het is mogelijk om PRIMARY|UNIQUE KEY in de toekomst te ondersteunen, maar dit is onwaarschijnlijk voor FOREIGN KEY.

Voorbeelden

Bereid een tabel voor met enkele gegevens

Code
create table tab (  id int not null,  f1 varchar(64));
insert into tab values (1, '1');
insert into tab values (1, '2');commit;

creëer een index met behulp van de CONCURRENTLY-clausule

Code
create index idx_tab_f1 on tab(f1) concurrently;

creëer een unieke index op een kolom met duplicaten

Code
create unique index idx_tab_id on tab(id);

dit geeft een foutmelding:

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)

creëer dezelfde unieke index met behulp van CONCURRENTLY

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

dit geeft een waarschuwing:

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)

controleer of de index bestaat:

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

let op de NOT VALIDATED markering.

Valideer de 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)

Corrigeer het dubbele record en valideer opnieuw

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

geen foutmelding.

Controleer de indexstatus:

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

Download HQbird en probeer het nu: /nl/download-hqbird