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
CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]] INDEX indexname ON tablename {(col [, col ...]) | COMPUTED BY ()} [WHERE ] [CONCURRENTLY]
Bestaande index activeren
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:
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
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
create index idx_tab_f1 on tab(f1) concurrently;
creëer een unieke index op een kolom met duplicaten
create unique index idx_tab_id on tab(id);
dit geeft een foutmelding:
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
create unique index idx_tab_id on tab(id) concurrently;
dit geeft een waarschuwing:
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:
show index idx_tab_id;
IDX_TAB_ID UNIQUE NOT VALIDATED INDEX ON (ID)
let op de NOT VALIDATED markering.
Valideer de 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)
Corrigeer het dubbele record en valideer opnieuw
update tab set id = 2 where f1 = '2';
commit;
alter index idx_tab_id validate unique;
geen foutmelding.
Controleer de indexstatus:
show index idx_tab_id;
IDX_TAB_ID UNIQUE INDEX ON (ID)
Download HQbird en probeer het nu: /nl/download-hqbird