Ta strona została przetłumaczona maszynowo. Przeczytaj oryginał angielski. English

Biblioteka IBSurgeon

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

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

Aktywuj istniejący indeks

Code
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:

Code
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:

Code
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:

Code
create index idx_tab_f1 on tab(f1) concurrently;

Utwórz unikalny indeks na kolumnie z duplikatami:

Code
create unique index idx_tab_id on tab(id);

To zgłasza błąd:

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)

Utwórz ten sam unikalny indeks za pomocą CONCURRENTLY:

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

To daje ostrzeżenie:

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)

Sprawdź, czy indeks istnieje:

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

Zwróć uwagę na znacznik NOT VALIDATED.

Zwaliduj indeks:

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)

Napraw zduplikowany rekord i zwaliduj ponownie:

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

Brak błędu.

Sprawdź stan indeksu:

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

Pobierz HQbird i wypróbuj już teraz: /pl/download-hqbird