Gleichzeitige Indexerstellung in Firebird 5
Derzeit ist es beim Aufbau eines Index nicht erlaubt, Änderungen an Tabellendaten vorzunehmen. Dies ist erforderlich, um einen korrekten Index zu erstellen, der keine neuen Schlüssel vermisst, die während des Aufbaus eingefügt werden.
Der Algorithmus für den gleichzeitigen Indexaufbau ermöglicht es, die Zeit, in der eine solche Lesesperre erforderlich ist, erheblich zu verkürzen. Obwohl er die Notwendigkeit, gleichzeitige Änderungen an Tabellendaten zu blockieren, nicht vollständig beseitigt, ist die Dauer einer solchen Blockierung im Vergleich zum traditionellen nicht-gleichzeitigen Algorithmus viel kürzer. Dies ist besonders in Produktionsumgebungen nützlich, in denen das Blockieren von Benutzeraktivitäten über längere Zeiträume unpraktisch oder unmöglich ist.
Aufgrund der gleichzeitigen Last und der zusätzlichen Komplexität kann die gleichzeitige Indexerstellung länger dauern als der traditionelle Ansatz.
Syntax
Das neue optionale Nicht-Reservierte-Schlüsselwort CONCURRENTLY wird verwendet, um die gleichzeitige Indexerstellung anzugeben.
Neuen Index erstellen
CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]] INDEX indexname ON tablename {(col [, col ...]) | COMPUTED BY ()} [WHERE ] [CONCURRENTLY]
Vorhandenen Index aktivieren
ALTER INDEX indexname {ACTIVE | INACTIVE} [CONCURRENTLY]
Hinweis: CONCURRENTLY kann nur mit ACTIVE verwendet werden.
Eindeutigkeitsvalidierung
Es ist schwierig bis unmöglich, die Index-Eindeutigkeit zu überprüfen, während der Index gleichzeitig aufgebaut wird. Daher wird ein eindeutiger Index, der gleichzeitig erstellt (oder aktiviert) wird, sofort im Systemkatalog als NOT VALIDATED markiert. Die Index-Eindeutigkeit wird nach Abschluss des Indexaufbaus validiert, wenn der Index Schlüssel für alle Datensätze der Tabelle enthält.
Wenn die Eindeutigkeitsprüfung erfolgreich ist, wird die Markierung NOT VALIDATED entfernt.
Wenn die Eindeutigkeitsprüfung fehlschlägt, bleibt der Index aktiv und wird als NOT VALIDATED markiert. Später kann der Benutzer Duplikate finden und beheben und die Eindeutigkeit erneut validieren oder den Index löschen, falls dies angemessen ist.
Hinweis: Ein NOT VALIDATED eindeutiger Index erlaubt weiterhin nicht das Einfügen von Duplikaten in die Tabelle.
Um einen eindeutigen Index zu validieren, führen Sie Folgendes aus:
ALTER INDEX indexname VALIDATE UNIQUE
Diese Anweisung führt einen Index-Scan durch, um doppelte Schlüssel zu finden und die entsprechenden Datensätze zu überprüfen. Wenn keine Duplikate gefunden werden, wird die Markierung NOT VALIDATED entfernt und der Index gilt als validiert. Andernfalls bleibt die Markierung NOT VALIDATED bestehen und der Index kann später erneut validiert werden.
Der isql-Befehl SHOW INDEX zeigt jetzt die Markierung NOT VALIDATED an, falls vorhanden.
Tabellenbeschränkungen
Die gleichzeitige Erstellung von Indizes für Tabellenbeschränkungen wie PRIMARY|UNIQUE|FOREIGN KEY wird noch nicht unterstützt. Es ist möglich, PRIMARY|UNIQUE KEY in der Zukunft zu unterstützen, aber für FOREIGN KEY ist dies unwahrscheinlich.
Beispiele
Bereiten Sie eine Tabelle mit einigen Daten vor
create table tab ( id int not null, f1 varchar(64));
insert into tab values (1, '1');
insert into tab values (1, '2');commit;
Erstellen Sie einen Index mit der CONCURRENTLY-Klausel
create index idx_tab_f1 on tab(f1) concurrently;
Erstellen Sie einen eindeutigen Index auf einer Spalte mit Duplikaten
create unique index idx_tab_id on tab(id);
Dies führt zu einem Fehler:
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)
Erstellen Sie denselben eindeutigen Index mit CONCURRENTLY
create unique index idx_tab_id on tab(id) concurrently;
Dies führt zu einer Warnung:
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)
Überprüfen Sie, ob der Index vorhanden ist:
show index idx_tab_id;
IDX_TAB_ID UNIQUE NOT VALIDATED INDEX ON (ID)
Beachten Sie die Markierung NOT VALIDATED.
Validieren Sie den 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)
Beheben Sie den doppelten Datensatz und validieren Sie erneut
update tab set id = 2 where f1 = '2';
commit;
alter index idx_tab_id validate unique;
Kein Fehler.
Überprüfen Sie den Indexstatus:
show index idx_tab_id;
IDX_TAB_ID UNIQUE INDEX ON (ID)
Laden Sie HQbird herunter und probieren Sie es jetzt aus: /de/download-hqbird