Bu sayfa makine çevirisidir. İngilizce orijinalini okuyun. English

IBSurgeon kütüphanesi

Firebird 5'te eşzamanlı indeks oluşturma

Şu anda, indeks oluşturulurken tablo verilerinde herhangi bir değişiklik yapılmasına izin verilmez. Bu, oluşturma sırasında eklenen yeni anahtarları kaçırmayan doğru bir indeks oluşturmak için gereklidir.

Eşzamanlı indeks oluşturma algoritması, böyle bir okuma kilidinin gerekli olduğu süreyi önemli ölçüde kısaltmayı sağlar. Tablo verilerindeki eşzamanlı değişiklikleri engelleme ihtiyacını tamamen ortadan kaldırmasa da, bu tür engelleme süresi geleneksel eşzamanlı olmayan algoritmaya kıyasla çok daha kısadır. Bu, özellikle kullanıcı aktivitesinin uzun süre engellenmesinin pratik olmadığı veya imkansız olduğu üretim ortamlarında kullanışlıdır.

Eşzamanlı yük ve ek karmaşıklık nedeniyle, eşzamanlı indeks oluşturma geleneksel yaklaşımdan daha uzun sürebilir.

Sözdizimi

Eşzamanlı indeks oluşturmayı belirtmek için kullanılan yeni isteğe bağlı, ayrılmamış anahtar kelime CONCURRENTLY.

Yeni indeks oluşturma

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

Mevcut indeksi etkinleştirme

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

Not: CONCURRENTLY yalnızca ACTIVE ile kullanılabilir.

Benzersizlik doğrulaması

İndeks eşzamanlı olarak oluşturulurken indeks benzersizliğini kontrol etmek zor, hatta imkansızdır. Bu nedenle, benzersiz bir indeks eşzamanlı olarak oluşturulduğunda (veya etkinleştirildiğinde), sistem kataloğunda hemen NOT VALIDATED olarak işaretlenir. İndeks benzersizliği, indeks oluşturma tamamlandıktan sonra, indeks tablodaki tüm kayıtlar için anahtarlar içerdiğinde doğrulanır.

Benzersizlik kontrolü başarılı olursa NOT VALIDATED işareti kaldırılır.

Benzersizlik kontrolü başarısız olursa, indeks etkin kalır ve NOT VALIDATED olarak işaretlenir. Kullanıcı daha sonra yinelenen kayıtları bulup düzeltebilir ve benzersizliği tekrar doğrulayabilir veya uygunsa indeksi silebilir.

Not: NOT VALIDATED benzersiz indeks, tabloya yinelenen kayıtların girilmesine hâlâ izin vermez.

Benzersiz indeksi doğrulamak için şunu çalıştırın:

Code
ALTER INDEX indexname VALIDATE UNIQUE

Bu ifade, yinelenen anahtarları bulmak ve ilgili kayıtları kontrol etmek için indeks taraması gerçekleştirir. Yinelenen kayıt bulunmazsa, NOT VALIDATED işareti kaldırılır ve indeks doğrulanmış olarak kabul edilir. Aksi takdirde, NOT VALIDATED işareti yerinde kalır ve indeks daha sonra tekrar doğrulanabilir.

isql komutu SHOW INDEX artık varsa NOT VALIDATED işaretini gösterir.

Tablo kısıtlamaları

PRIMARY|UNIQUE|FOREIGN KEY gibi tablo kısıtlamaları için indekslerin eşzamanlı oluşturulması henüz desteklenmemektedir. Gelecekte PRIMARY|UNIQUE KEY desteklenebilir, ancak FOREIGN KEY için pek olası değildir.

Örnekler

Bazı verilerle tablo hazırlayın

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 ifadesini kullanarak indeks oluşturun

Code
create index idx_tab_f1 on tab(f1) concurrently;

yinelenen kayıtlar içeren sütunda benzersiz indeks oluşturun

Code
create unique index idx_tab_id on tab(id);

bu bir hata verir:

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)

aynı benzersiz indeksi CONCURRENTLY kullanarak oluşturun

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

bu bir uyarı verir:

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)

indeksin var olup olmadığını kontrol edin:

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

NOT VALIDATED işaretine dikkat edin.

İndeksi doğrulayın:

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)

Yinelenen kaydı düzeltin ve tekrar doğrulayın

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

hata yok.

İndeks durumunu kontrol edin:

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

HQbird’i indirin ve hemen deneyin: /tr/download-hqbird