Ова страница је машински преведена. Прочитајте енглески оригинал. English

IBSurgeon библиотека

Kreiranje indeksa istovremeno u Firebird 5

Тренутно, док се индекс гради, није дозвољена ниједна измена података у табели. Ово је неопходно да би се створио исправан индекс који не пропушта нове кључеве уметнуте током изградње.

Алгоритам за конкурентну изградњу индекса омогућава значајно скраћење времена током којег је потребна таква read lock. Иако не у потпуности елиминише потребу за блокирањем конкурентних измена података у табели, време таквог блокирања је много краће у поређењу са традиционалним неконкурентним алгоритмом. Ово је посебно корисно у производном окружењу где је блокирање активности корисника на дужи период непрактично или немогуће.

Због конкурентног оптерећења и додатне сложености, конкурентно креирање индекса може потрајати дуже од традиционалног приступа.

Синтакса

Нова опциона нерезервисана кључна реч CONCURRENTLY користи се за спецификацију конкурентног креирања индекса.

Креирање новог индекса

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

Активирање постојећег индекса

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

Напомена: CONCURRENTLY се може користити само са ACTIVE.

Валидација јединствености

Тешко је или немогуће проверити јединственост индекса док се индекс гради конкурентно. Због тога, када се јединствени индекс креира (или активира) конкурентно, одмах се означава као NOT VALIDATED у системском каталогу. Јединственост индекса се валидира након што је изградња индекса завршена, када индекс садржи кључеве за све записе у табели.

Ако провера јединствености успе, ознака NOT VALIDATED се уклања.

Ако провера јединствености не успе, индекс остаје активан и означен је као NOT VALIDATED. Касније корисник може пронаћи и исправити дупликате и поново валидирати јединственост или обрисати индекс ако је то прикладно.

Напомена: NOT VALIDATED јединствени индекс и даље не дозвољава унос дупликата у табелу.

За валидацију јединственог индекса, покрените

Code
ALTER INDEX indexname VALIDATE UNIQUE

Ова изјава врши скенирање индекса да би пронашла дупликате кључева и проверила одговарајуће записе. Ако нема дупликата, ознака NOT VALIDATED се уклања и индекс се сматра валидираним. У супротном, ознака NOT VALIDATED остаје на месту и индекс се може поново валидирати касније.

isql команда SHOW INDEX сада приказује ознаку NOT VALIDATED, ако је присутна.

Ограничења табеле

Конкурентно креирање индекса за ограничења табеле, као што су PRIMARY|UNIQUE|FOREIGN KEY, још увек није подржано. Могуће је подржати PRIMARY|UNIQUE KEY у будућности, али је мало вероватно за FOREIGN KEY.

Примери

Припремите табелу са подацима

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

креирајте индекс користећи клаузулу CONCURRENTLY

Code
create index idx_tab_f1 on tab(f1) concurrently;

креирајте јединствени индекс на колони са дупликатима

Code
create unique index idx_tab_id on tab(id);

ово даје грешку:

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)

креирајте исти јединствени индекс користећи CONCURRENTLY

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

ово даје упозорење:

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)

проверите да ли индекс постоји:

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

приметите ознаку NOT VALIDATED.

Валидирајте индекс:

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)

Исправите дупликат записа и поново валидирајте

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

нема грешке.

Проверите стање индекса:

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

Преузмите HQbird и испробајте га одмах: /sr/download-hqbird