Równoczesne tworzenie indeksów w Firebird 5
Obecnie, gdy budowany jest indeks, wszelkie modyfikacje danych tabeli nie są dozwolone. Jest to wymagane, aby utworzyć poprawny indeks bez pomijania nowych kluczy wstawionych podczas budowy.
Algorytm równoległego budowania indeksu pozwala znacznie skrócić czas, w którym wymagana jest taka blokada odczytu. Chociaż nie eliminuje w pełni potrzeby blokowania równoczesnych modyfikacji danych tabeli, czas takiego blokowania jest znacznie krótszy w porównaniu z tradycyjnym, nierównoległym algorytmem. Jest to szczególnie przydatne w środowisku produkcyjnym, gdzie blokowanie aktywności użytkowników na długie okresy jest niepraktyczne lub niemożliwe.
Ze względu na równoczesne obciążenie i dodatkową złożoność, równoczesne tworzenie indeksu może trwać dłużej niż tradycyjne podejście.
Składnia
Nowe opcjonalne, niezarezerwowane słowo kluczowe CONCURRENTLY służy do określenia równoczesnego tworzenia indeksu.
Utwórz nowy indeks
CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]] INDEX indexname ON tablename {(col [, col ...]) | COMPUTED BY ()} [WHERE ] [CONCURRENTLY]
Aktywuj istniejący indeks
ALTER INDEX indexname {ACTIVE | INACTIVE} [CONCURRENTLY]
Uwaga: CONCURRENTLY może być użyte tylko z ACTIVE.
Walidacja unikalności
Trudno, a nawet niemożliwe jest sprawdzenie unikalności indeksu podczas jego równoczesnego budowania. Dlatego gdy unikalny indeks jest tworzony (lub aktywowany) równocześnie, jest natychmiast oznaczany jako NOT VALIDATED w katalogu systemowym. Unikalność indeksu jest walidowana po zakończeniu budowy indeksu, gdy indeks zawiera klucze dla wszystkich rekordów tabeli.
Jeśli sprawdzenie unikalności zakończy się sukcesem, znacznik NOT VALIDATED jest usuwany.
Jeśli sprawdzenie unikalności zakończy się niepowodzeniem, indeks pozostaje aktywny i jest oznaczony jako NOT VALIDATED. Później użytkownik może znaleźć i naprawić duplikaty oraz ponownie zwalidować unikalność lub usunąć indeks, jeśli to właściwe.
Uwaga: unikalny indeks NOT VALIDATED nadal nie pozwala na wprowadzanie duplikatów do tabeli.
Aby zwalidować unikalny indeks, uruchom:
ALTER INDEX indexname VALIDATE UNIQUE
Ta instrukcja wykonuje skanowanie indeksu w celu znalezienia zduplikowanych kluczy i sprawdzenia odpowiednich rekordów. Jeśli nie znaleziono duplikatów, znacznik NOT VALIDATED jest usuwany, a indeks jest uważany za zwalidowany. W przeciwnym razie znacznik NOT VALIDATED pozostaje na miejscu i indeks może być ponownie zwalidowany później.
Polecenie isql SHOW INDEX wyświetla teraz znacznik NOT VALIDATED, jeśli jest obecny.
Ograniczenia tabeli
Równoczesne tworzenie indeksów dla ograniczeń tabeli, takich jak PRIMARY|UNIQUE|FOREIGN KEY, nie jest jeszcze obsługiwane. Możliwe jest wsparcie PRIMARY|UNIQUE KEY w przyszłości, ale jest mało prawdopodobne dla FOREIGN KEY.
Przykłady
Przygotuj tabelę z danymi:
create table tab ( id int not null, f1 varchar(64));
insert into tab values (1, '1');
insert into tab values (1, '2');commit;
Utwórz indeks za pomocą klauzuli CONCURRENTLY:
create index idx_tab_f1 on tab(f1) concurrently;
Utwórz unikalny indeks na kolumnie z duplikatami:
create unique index idx_tab_id on tab(id);
To zgłasza błąd:
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)
Utwórz ten sam unikalny indeks za pomocą CONCURRENTLY:
create unique index idx_tab_id on tab(id) concurrently;
To daje ostrzeżenie:
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)
Sprawdź, czy indeks istnieje:
show index idx_tab_id;
IDX_TAB_ID UNIQUE NOT VALIDATED INDEX ON (ID)
Zwróć uwagę na znacznik NOT VALIDATED.
Zwaliduj indeks:
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)
Napraw zduplikowany rekord i zwaliduj ponownie:
update tab set id = 2 where f1 = '2';
commit;
alter index idx_tab_id validate unique;
Brak błędu.
Sprawdź stan indeksu:
show index idx_tab_id;
IDX_TAB_ID UNIQUE INDEX ON (ID)
Pobierz HQbird i wypróbuj już teraz: /pl/download-hqbird