Questa pagina è stata tradotta automaticamente. Leggi l'originale in inglese. English

Libreria IBSurgeon

Creazione concorrente degli indici in Firebird 5

Attualmente, durante la costruzione di un indice, non è consentita alcuna modifica ai dati della tabella. Questo è necessario per creare un indice corretto che non perda nuove chiavi inserite durante la costruzione.

L’algoritmo di costruzione concorrente dell’indice consente di ridurre significativamente il tempo in cui è richiesto tale blocco in lettura. Sebbene non elimini completamente la necessità di bloccare le modifiche concorrenti ai dati della tabella, il tempo di tale blocco è molto inferiore rispetto all’algoritmo tradizionale non concorrente. Questo è particolarmente utile in ambienti di produzione dove bloccare l’attività degli utenti per lunghi periodi è impraticabile o impossibile.

A causa del carico concorrente e della complessità aggiuntiva, la creazione concorrente dell’indice potrebbe richiedere più tempo rispetto all’approccio tradizionale.

Sintassi

La nuova parola chiave opzionale non riservata CONCURRENTLY viene utilizzata per specificare la creazione concorrente dell’indice.

Creare un nuovo indice

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

Attivare un indice esistente

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

Nota: CONCURRENTLY può essere utilizzato solo con ACTIVE.

Validazione dell’unicità

È difficile, se non impossibile, verificare l’unicità dell’indice mentre viene costruito in modo concorrente. Pertanto, quando un indice univoco viene creato (o attivato) in modo concorrente, viene immediatamente marcato come NOT VALIDATED nel catalogo di sistema. L’unicità dell’indice viene validata dopo il completamento della costruzione dell’indice, quando l’indice contiene chiavi per tutti i record della tabella.

Se il controllo di unicità ha successo, il marcatore NOT VALIDATED viene rimosso.

Se il controllo di unicità fallisce, l’indice rimane attivo e viene marcato come NOT VALIDATED. Successivamente, l’utente può trovare e correggere i duplicati e validare nuovamente l’unicità, oppure eliminare l’indice se appropriato.

Nota: un indice univoco NOT VALIDATED non consente comunque di inserire duplicati nella tabella.

Per validare un indice univoco, eseguire:

Code
ALTER INDEX indexname VALIDATE UNIQUE

Questa istruzione esegue una scansione dell’indice per trovare chiavi duplicate e verificare i record corrispondenti. Se non vengono trovati duplicati, il marcatore NOT VALIDATED viene rimosso e l’indice viene considerato validato. Altrimenti, il marcatore NOT VALIDATED rimane e l’indice può essere validato nuovamente in seguito.

Il comando isql SHOW INDEX ora mostra il marcatore NOT VALIDATED, se presente.

Vincoli di tabella

La creazione concorrente di indici per vincoli di tabella, come PRIMARY|UNIQUE|FOREIGN KEY, non è ancora supportata. È possibile supportare PRIMARY|UNIQUE KEY in futuro, ma è improbabile per FOREIGN KEY.

Esempi

Preparare una tabella con alcuni dati:

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

Creare un indice utilizzando la clausola CONCURRENTLY:

Code
create index idx_tab_f1 on tab(f1) concurrently;

Creare un indice univoco su una colonna con duplicati:

Code
create unique index idx_tab_id on tab(id);

Questo genera un errore:

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)

Creare lo stesso indice univoco utilizzando CONCURRENTLY:

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

Questo genera un avviso:

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)

Verificare se l’indice esiste:

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

Notare il marcatore NOT VALIDATED.

Validare l’indice:

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)

Correggere il record duplicato e validare nuovamente:

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

Nessun errore.

Controllare lo stato dell’indice:

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

Scarica HQbird e provalo subito: /it/download-hqbird