このページは機械翻訳されています。英語の原文をお読みください。 English

IBSurgeon ライブラリ

Firebird 5における同時インデックス作成

現在、インデックスが構築されている間、テーブルデータの変更は一切許可されません。これは、構築中に挿入された新しいキーを見逃さず、正しいインデックスを作成するために必要です。

同時インデックス構築アルゴリズムにより、このような読み取りロックが必要な時間を大幅に短縮できます。テーブルデータへの同時変更をブロックする必要性を完全に排除するわけではありませんが、ブロック時間は従来の非同時アルゴリズムと比較してはるかに短くなります。これは、長時間にわたるユーザーアクティビティのブロックが非現実的または不可能な本番環境で特に有用です。

同時負荷と追加の複雑さにより、同時インデックス作成は従来のアプローチよりも時間がかかる可能性があります。

構文

新しいオプションの非予約キーワード 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]

注: CONCURRENTLYACTIVE とのみ使用できます。

一意性の検証

インデックスが同時に構築されている間にインデックスの一意性をチェックすることは困難から不可能です。したがって、一意インデックスが同時に作成(またはアクティブ化)されると、システムカタログで即座に 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 をダウンロードして今すぐお試しください: /ja/download-hqbird